在头文件in.h中,可以看到这种模式:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
重新定义已定义符号的原因是什么?如果我理解正确,当预处理器遇到IPPROTO_ICMP时,它将用IPPROTO_ICMP替换它,所以什么都不会改变。
答案 0 :(得分:3)
自引用的一个常见且有用的用途是创建一个扩展到自身的宏。如果你写
#define EPERM EPERM
然后宏EPERM扩展到EPERM。实际上,只要它在运行文本中使用,它就会被预处理器单独留下。您可以告诉它是#ifdef
的宏。如果要使用enum
定义数字常量,但每个常量的#ifdef
为真,则可以执行此操作。
答案 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