c++ - C++ 中#define 指令的用途是什么?

标签 c++ c-preprocessor

#define 指令的作用是什么?

最佳答案

#define 用于在 C 和 C++ 中创建宏。您可以在 C preprocessor documentation 中阅读更多相关信息.简单的回答是它做了一些事情:

  1. 简单的宏 - 基本上只是文本替换。编译时间常量就是一个很好的例子:

    #define SOME_CONSTANT 12
    

    只需将出现在代码中的文本 SOME_CONSTANT 替换为 12。这种宏通常用于提供代码块的条件编译。例如,项目中的每个源文件都可能包含一个 header ,其中包含项目的选项列表:

    #define OPTION_1
    #define OPTION_2
    #undef  OPTION_3
    

    然后项目中的代码块将被匹配的 #ifdef/#endif# block 包裹起来,以在完成的项目中启用和禁用这些选项。使用 -D gcc 标志会提供类似的行为。然而,对于这种方法是否真的是为应用程序提供配置的好方法,存在强烈的意见。

  2. 带参数的宏 - 允许您制作可以接受参数并对其进行操作的“类似函数”的宏。例如:

    #define SQUARE(x)  ((x) * (x))
    

    将返回参数的平方作为结果;注意潜在的操作顺序或副作用问题!以下示例:

    int x = SQUARE(3);     // becomes int x = ((3) * (3));
    

    会正常工作,但像这样:

    int y = SQUARE(f());   // becomes int y = ((f()) * (f()));
    

    将调用 f() 两次,甚至更糟:

    int z = SQUARE(x++);   // becomes int z = ((x++) * (x++));
    

    导致未定义的行为!

    使用一些工具,带参数的宏也可以是 variadic ,可以派上用场。

正如下面评论中提到的,过度使用宏,或者开发过于复杂或困惑的宏被许多人认为是糟糕的风格——一如既往,将代码的可读性、可维护性和可调试性置于“聪明”的技术技巧之上.

关于c++ - C++ 中#define 指令的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2806347/

相关文章:

c - 在#define 之前使用#undef

c++ - open62541: 同时获取订阅所有变化的监控项

c++ - 不在 header 中包含所有函数声明以创建 "private namespace"是否可以接受?

c++ - 过滤 Boost 文件系统中的文件夹

c - 获取函数名称作为符号(而不是字符串)- C 预处理器

C 预处理器在扩展命令行中定义的宏后添加尾随 "1"

c++ - C++中原子变量的线程安全初始化

c++ - 数据集中最常见的值(有变化)

C 宏 : Select macro using concatenation of string and number

c - 宏打印输出