刚刚定义的符号的相同重新定义

时间:2016-07-01 06:41:29

标签: c c-preprocessor

在头文件in.h中,可以看到这种模式:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

重新定义已定义符号的原因是什么?如果我理解正确,当预处理器遇到IPPROTO_ICMP时,它将用IPPROTO_ICMP替换它,所以什么都不会改变。

2 个答案:

答案 0 :(得分:3)

自引用的一个常见且有用的用途是创建一个扩展到自身的宏。如果你写

#define EPERM EPERM

然后宏EPERM扩展到EPERM。实际上,只要它在运行文本中使用,它就会被预处理器单独留下。您可以告诉它是#ifdef的宏。如果要使用enum定义数字常量,但每个常量的#ifdef为真,则可以执行此操作。

参考:http://gcc.gnu.org/onlinedocs/gcc-4.6.2/cpp/Self_002dReferential-Macros.html#Self_002dReferential-Macros

答案 1 :(得分:2)

据我所知,在C预处理程序指令中使用枚举是很糟糕的! 如果您尝试编译此代码 - 您将收到错误:

enum {
    VAL_0 = 0,
    VAL_1,
};
#if (!defined(VAL_0))
#   error "VAL_0 not defined!"
#endif

但是!在这种情况下,不会产生错误:

enum {
    VAL_0 = 0,
#   define VAL_0    VAL_0
    VAL_1,
#   define VAL_1    VAL_1
};
#if (!defined(VAL_0))
#   error "VAL_0 not defined!"
#endif

修改

正如Twinkle所写,它只是定义了没有值的枚举成员。所以这个预处理器构造会出错:

#if (VAL_1 != 1)
#   error "VAL_1 just defined and have default value 0"
#endif