Joe*_*Joe 4 c c++ if-statement c-preprocessor
在C/C++,正是两者的区别#define[和#ifndef #endif]来创造价值,当你可以很容易地用做int或std::string[C++]吗?
#ifndef MYVAL
#define MYVAL(500)
#endif
//C++
cout << MYVAL << endl;
//C
printf(MYVAL);
Run Code Online (Sandbox Code Playgroud)
//C++
int MYVAL = 500;
cout << MYVAL << endl;
//C
int MYVAL = 500;
printf(MYVAL);
Run Code Online (Sandbox Code Playgroud)
在我进入历史之前,这是对两者之间差异的简要理解.
变量是变量.它们在编译的程序中占用空间,除非你用它们标记它们const(这是一个比宏更晚的开发),它们是可变的.
另一方面,宏被预处理.编译器永远不会看到宏.而是在编译之前处理宏.预编译器遍历代码,查找每个宏,并将其与宏文本逐字替换.这可能非常强大,有点用,而且非常危险(因为它修改代码并且在执行此操作时从不进行任何检查).
此外,可以在命令行上设置宏.您可以在编译时根据需要定义任意数量的内容,如果您的代码检查该宏,则它的行为可能会有所不同.
宏在C++之前很久就存在了.它们对很多东西很有用:
const符之前,因此它们是维护常量"变量"的简单方法 - 预编译器会将所有MYVAR实例替换为500.在有限的情况下,你只是使用一个宏来表示一个常量表达式,你是对的 - 它们不再需要它们了.
不同之处在于,使用宏(#),预处理器会对该符号进行搜索和替换.替换没有类型检查.
创建变量时,会对其进行类型化,编译器会在您使用它的位置进行类型检查.
C/C++编译器通常被认为是2遍编译器.第一遍是预处理器,它在宏上进行搜索和替换.第二遍是实际编译,其中创建了声明的变量.
宏通常用于创建更复杂的表达式,因此代码不必重复多次,因此语法更紧凑.它们很有用,但由于它们"盲目"搜索和替换性质而更加危险.此外,您无法使用调试器进入宏,因此可能难以进行故障排除.
此外,宏不遵守任何范围规则. #define MYVAL(500)将取代MYVAL同500即便如此,你必须以这种方式更加小心出现它的功能,全球范围内,类声明等.
| 归档时间: |
|
| 查看次数: |
654 次 |
| 最近记录: |