#define 宏名 要替换的文本宏名,即宏的名称,在源代码中替换其后的文本;可替换的文本,也就是宏所指代的文本内容。#define、宏名和可替换文本之间用空格(或制表符)分隔。
#define H 1 + 2 + 3 + 4其中,H 是宏名,后面是
1 + 2 + 3 + 4
是 H 要替换的文本内容。#include <iostream> #define AGE 30 #define NAME "John" int main() { const char* name = NAME; int age = AGE; std::cout << name << " " << age << std::endl; return 0; }程序在编译之前,预处理器会将程序中所有的 NAME 替换为 "John",将程序中所有的 AGE 替换成 30。
John 30
#include <iostream> #define MESSAGE \ std::cout << "C语言中文网"<< std::endl; \ std::cout << "url:http://task.lmcjl.com" << std::endl; int main() { MESSAGE return 0; }执行结果为:
C语言中文网
url:http://task.lmcjl.com
#define 宏名(参数1, 参数2, ..., 参数 n) 要替换的文本注意,定义带参数的宏,宏名和左括号之间不能有空格。
#include <iostream> #define LESS(a,b) (a>b?b:a) int main() { std::cout << LESS(3, 5) << std::endl; // 输出 3 和 5 中的较小值 std::cout << LESS(10, 8) << std::endl; // 输出 10 和 8 中的较小值 return 0; }执行结果为:
3
8
a>b?b:a
必须括起来,否则预处理器将程序中的宏展开后,程序中的输出语句就变成了:std::cout << 3>5?5:3 << std::endl; std::cout << 10>8?8:10 << std::endl;代码中 <<、>、?、: 各种符号杂糅在一起,编译器无法正确识别条件运算符,导致程序编译失败。
#include <iostream> #define ADD(x,y) x+y int main() { std::cout << 5* ADD(3,4) << std::endl; return 0; }如果凭借第一印象,很可能会做这样的计算:5×(3+4)=35。但是,预处理器并不这么认为,而会做这样的解释:5×3+4=19。
19
所以读者写宏的时候一定要小心,预防宏的行为不符合预期。#include <iostream> #define ADD(x,y) (x+y) int main() { std::cout << 5* ADD(3,4) << std::endl; return 0; }
#include <iostream> #define CONCATENATE(a, b) a ## b #define TO_STRING(x) #x #define PRINT_EXPR(expr) std::cout << #expr << " = " << expr << std::endl int main() { // 使用##操作符将两个整数连接在一起 int xy = CONCATENATE(1, 2); // 实际上就是int xy = 12; std::cout << "xy = " << xy << std::endl; // 使用#操作符将标记转换为字符串 const char* str = TO_STRING(Hello World); // 实际上就是const char* str = "Hello World"; std::cout << "str = " << str << std::endl; // 综合使用 int a = 5, b = 10; PRINT_EXPR(a + b); // 输出 "a + b = 15" return 0; }执行结果为:
xy = 12
str = Hello World
a + b = 15
本文链接:http://task.lmcjl.com/news/17081.html