c ++中的宏观和意外结果

时间:2015-08-11 07:35:25

标签: c++

我无法为这个问题找到合适的title,对不起;

我在博客中找到了以下代码

#include <iostream>

#define TEN 10;
#define EIGHT TEN-2; 

int main() {
    int size = EIGHT;
    std::cout << size;
}

Out Put: 10

为什么10不是8

2 个答案:

答案 0 :(得分:4)

宏是预处理器的指令,而不是C ++语句。它们不需要以分号结尾,它们只是在令牌上进行替换。

您的代码扩展为:

int main() {
    int size = 10;-2;;
    std::cout << size;
}

请注意,分号已被替换。简单的解决方法是更改​​宏:

#define TEN 10
#define EIGHT TEN-2

但是,你应该使用const int而不是像这样的常量宏来避免像你刚刚遇到的那样的问题。

答案 1 :(得分:1)

  1. #define中的表达式评估应该用括号括起来:

    #define EIGHT (TEN - 2)
    
  2. 来自N4296

      

    表格的预处理指令:

    #define identifier replacement-list new-line 
    
         

    定义了一个类似于对象的宏,它使宏名称的每个后续实例都被构成指令其余部分的预处理标记的替换列表替换。

  3. 所以不需要任何;,正如@TartanLlama指出的那样。这导致了你的问题。