Car*_*rum 14
#define用于在C和C++中创建宏.您可以在C预处理器文档中阅读有关它的更多信息.快速回答是它做了一些事情:
简单的宏 - 基本上只是文本替换.编译时间常量是一个很好的例子:
#define SOME_CONSTANT 12
Run Code Online (Sandbox Code Playgroud)
只是替换文本SOME_CONSTANT与12无论它出现在你的代码.这种宏通常用于提供代码块的条件编译.例如,项目中的每个源文件都可能包含一个标头,其中包含项目的选项列表:
#define OPTION_1
#define OPTION_2
#undef OPTION_3
Run Code Online (Sandbox Code Playgroud)
然后,项目中的代码块将使用匹配#ifdef/ #endif#块进行包装,以在已完成的项目中启用和禁用这些选项.使用-Dgcc标志会提供类似的行为.但是,对于该方法是否真的是为应用程序提供配置的好方法,存在强烈的意见.
带参数的宏 - 允许你制作'类似函数'的宏,它可以接受参数并操纵它们.例如:
#define SQUARE(x) ((x) * (x))
Run Code Online (Sandbox Code Playgroud)
会返回参数的平方作为结果; 注意潜在的操作顺序或副作用问题!以下示例:
int x = SQUARE(3); // becomes int x = ((3) * (3));
Run Code Online (Sandbox Code Playgroud)
会工作正常,但有点像:
int y = SQUARE(f()); // becomes int y = ((f()) * (f()));
Run Code Online (Sandbox Code Playgroud)
会打f()两次电话,甚至更糟:
int z = SQUARE(x++); // becomes int z = ((x++) * (x++));
Run Code Online (Sandbox Code Playgroud)
导致未定义的行为!
对于某些工具,带参数的宏也可以是可变参数,这可以派上用场.
正如下面评论中所提到的,过度使用宏,或过度复杂或令人困惑的宏的开发被许多人认为是不好的风格 - 一如既往,将代码的可读性,可维护性和可调试性置于'聪明'的技术伎俩之上.
#define(与之相反,#undef)可用于设置编译器指令,然后可以使用#ifndef或#ifdef对其进行测试.这允许在源文件中定义自定义行为.它通常用于编译不同的环境或调试代码.
一个例子:
#define DEBUG
#ifdef DEBUG
//perform debug code
#endif
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8100 次 |
| 最近记录: |