问答详情
源自:2-7 不可改变的常量

#define POCKETMONEY 10

#define POCKETMONEY 10  这里后面加上分号就不能运行是什么鬼?

提问者:qq_旗号 2015-11-05 10:35

个回答

  • AAnonymous
    2015-11-05 12:36:16
    已采纳

    #define 本质上是字符的替换  

    比如

    #define A 1
    // ...
    int a = A;  // 编译的时候编译器就做了替换,这里变成了 int a = 1;

    如果你加了 分号,就变成了这种情况

    #define A 1;
    // ...
    int a = A; // 替换后就成了 int a = 1;;  这当然是错的

    所以说 #define 用的时候要注意,尤其是定义“函数”时,注意加括号,否则容易有歧义

    所以C++中,建议使用 const 来定义全局的常量,使用 typedef 定义类型别名,使用函数定义函数(C++可以使用functional模板函数,以及auto类型推断,很方便。当然因为C++不断的加新的特性,变得复杂臃肿,也有很多人不喜欢C++,比如Linux大神Linus喜欢纯C)

  • AAnonymous
    2015-11-05 12:41:44

    另外,因为只是字符替换,#define不会做类型检查,所以如果你使用#define定义“函数”,调用时传错了参数,编译器在编译的时候是不会发现的,这就把可能的错误推到了运行时,甚至可能不容易发现。这样是不好的,错误越早发现越好,所以建议能不用 #define 就不用 #define。当然个人观点而已,就像goto语句一样,虽然很多人建议不用,不过即使啊Google,在Android的源码里也经常使用goto