Car*_*rum 14

#define用于在C和C++中创建宏.您可以在C预处理器文档中阅读有关它的更多信息.快速回答是它做了一些事情:

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

    #define SOME_CONSTANT 12
    
    Run Code Online (Sandbox Code Playgroud)

    只是替换文本SOME_CONSTANT12无论它出现在你的代码.这种宏通常用于提供代码块的条件编译.例如,项目中的每个源文件都可能包含一个标头,其中包含项目的选项列表:

    #define OPTION_1
    #define OPTION_2
    #undef  OPTION_3
    
    Run Code Online (Sandbox Code Playgroud)

    然后,项目中的代码块将使用匹配#ifdef/ #endif#块进行包装,以在已完成的项目中启用和禁用这些选项.使用-Dgcc标志会提供类似的行为.但是,对于该方法是否真的是为应用程序提供配置的好方法,存在强烈的意见.

  2. 带参数的宏 - 允许你制作'类似函数'的宏,它可以接受参数并操纵它们.例如:

    #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)

    导致未定义的行为!

    对于某些工具,带参数的宏也可以是可变参数,这可以派上用场.

正如下面评论中所提到的,过度使用宏,或过度复杂或令人困惑的宏的开发被许多人认为是不好的风格 - 一如既往,将代码的可读性,可维护性和可调试性置于'聪明'的技术伎俩之上.

  • +1.由于OP询问了"#define"所扮演的"角色",因此应该强调宏不应该被过度使用. (5认同)
  • 我强调使用它们进行配置(`#ifdef` ...`#endif`中的代码段).在C++中,最好使用1)的consts和2)的模板. (5认同)

Spr*_*gue 7

#define(与之相反,#undef)可用于设置编译器指令,然后可以使用#ifndef或#ifdef对其进行测试.这允许在源文件中定义自定义行为.它通常用于编译不同的环境或调试代码.

一个例子:

#define DEBUG



#ifdef DEBUG

//perform debug code

#endif
Run Code Online (Sandbox Code Playgroud)