gcc's manual表示以下内容:
如果重新定义宏时使用的定义与旧定义实际上不相同,则预处理程序会发出警告并更改宏以使用新定义。**如果新定义实际上相同,则忽略重新定义。**例如,这允许两个不同的头文件定义一个公共宏。预处理程序只会在定义不匹配时发出警告。
(强调我)
是否有一种方法可以使gcc更加严格,并在重定义宏时发出警告,而不管定义如何?
示例:
#define TEST 1
#define TEST 1
int main(void) {
return 0;
}
使用gcc -Wall -Wextra -Wpedantic
进行编译不会产生任何警告。
1条答案
按热度按时间lymgl2op1#
从技术上讲,如果一个标头定义了一个苹果是红色的,那么另一个标头想确保每个人都知道这个苹果是红色的,这不应该是一个问题。这就是它背后的原因。如果多个库有相同的宏定义和相同的值,也不应该损害它们之间的链接。
定义苹果红
这是通常的态度,当你看到一些人想确保每个人都知道他们知道(我们都有这些朋友或同事,不是吗?:)),苹果是红色的,所以他们陈述显而易见的。
预处理器定义是在编译时“编译”的(也就是说,解释和替换或相应地评估)。因此,多次定义同一个令牌对应用程序来说没有真实的的开销,它可能只是增加了一点编译时间。
问题是,当一些聪明的家伙想让你知道苹果也可以是绿色的。
定义苹果绿色
然后,当你需要使用一些苹果,你最终得到:
包含“一些标题.h/hxx/hpp”
include“一些其他标题.h/hxx/hpp”
最后你得到了重新定义的“苹果“。
撇开查看冲突来源的艰巨任务不谈(通常是在合并多个第三方库/框架时,这些库/框架可能在宏中使用相似的名称,或者在宏的前缀中使用相同的首字母缩写词),这应该足以让您知道存在冲突。
请记住,这是一个警告,因此不会停止编译。要将警告视为错误,请使用**-Werror**。
老实说,我并不担心重复的定义。它们不会损害代码。如果你真的想进入过度开发模式,你总是可以做一些测试:
......或者......