如何在包含多个头文件时避免C语言类型重定义?
老哥,这个问题我太熟了——你碰到的是C语言里典型的重复类型定义坑,虽然两个头文件都加了头文件保护(#ifndef那套),但这玩意儿只能防止同一个头文件被重复包含,管不了不同头文件里定义同名typedef的情况。下面给你几个靠谱的解决方案:
方案1:统一公共类型到单独头文件
把所有公共的类型定义抽出来放到一个专门的头文件(比如common.h)里,然后让a.h和b.h都包含这个公共头文件,自己不再重复定义INT。
示例代码:common.h:#ifndef COMMON_H #define COMMON_H typedef int INT; #endif修改
a.h:#ifndef A_H #define A_H #include "common.h" // 原来的其他变量和函数定义 #endif修改
b.h:#ifndef B_H #define B_H #include "common.h" // 原来的其他变量和函数定义 #endif这样不管
main.c怎么包含头文件,INT只会被定义一次,完美解决冲突。方案2:用宏标记避免重复定义
如果不想抽公共头文件,可以给typedef加个宏标记,确保只有第一次包含时才定义INT。修改两个头文件如下:
修改a.h:#ifndef A_H #define A_H #ifndef INT_DEFINED #define INT_DEFINED typedef int INT; #endif // 原来的其他变量和函数定义 #endif修改
b.h:#ifndef B_H #define B_H #ifndef INT_DEFINED #define INT_DEFINED typedef int INT; #endif // 原来的其他变量和函数定义 #endif这里用
INT_DEFINED这个宏来标记INT是否已经被定义,不管先包含哪个头文件,INT都只会被定义一次。方案3:重命名类型(如果类型语义不同)
要是这两个头文件里的INT其实本意是不同的类型(虽然你现在都是typedef int),那最好给它们加前缀区分,比如A_INT和B_INT,从根源上避免命名冲突。
最后补个知识点:为啥原来的头文件保护没用?头文件保护的作用是防止同一个头文件被多次包含(比如a.h里包含了b.h,main.c又同时包含a.h和b.h,这时候b.h的保护会生效,避免重复包含),但你这是两个不同的头文件都定义了同一个typedef,所以保护机制管不了这种跨文件的同名定义。
内容的提问来源于stack exchange,提问作者SwapnilShivhare

