这个问题在10个月前我还需要去找领导,现在终于不用了。感觉好简单的说。
问题是这样,我引用了一个开源库,包含的它的头文件,显示宏冲突。开源库叫做TAO.c、TAO.h,我自己的文件叫OKAMOTO.c(大爱冈本多绪)。
1.define冲突
其中TAO.h中定义的宏和OKAMOTO.c中的冲突了,那肯定是ifndef啊,但是如果我把.h中的宏加上ifndef的话,会不会影响到TAO.c中原有的内容呢?我认为是不会的,问了几个同事,他们不确定,我就自己测试了一下,下面是内容
TAO.c
#include <stdio.h>
#include "TAO.h"
int main(void)
{
printf("x=%d\n",X);
return 0;
}
TAO.h
#ifndef X
#define X (1+1)
#endif
OKAMOTO.c
#include <stdio.h>
#define X (1+2)
#include "TAO.h"
int main(void)
{
printf("x=%d\n",X);
return 0;
}
原来确实是不会的,因为在编译TAO.c的时候X是没有定义的,所以会选择进入ifndef,但是在执行OKAMOTO.c的时候宏已经定义过了,自然就不会ifndef,互相之间并不影响
2.typedef冲突
这个又有点不一样,不能直接用ifndef了,比如
typedef unsigned int ULONG;
要是这么写就蠢了
#ifndef ULONG
typedef unsigned int ULONG;
#endif
那咋办嘞,这个很有意思
先看OKAMOTO.c
#include <stdio.h>
#define X (1+2)
typedef unsigned long ULONG;
#define type_conflicting_ULONG
#include "TAO.h"
int main(void)
{
printf("x=%d\n",X);
return 0;
}
再看TAO.h
#ifndef X
#define X (1+1)
#endif
#ifndef type_conflicting_ULONG
typedef unsigned int ULONG;
#endif
有没有感觉智商受到了侮辱,哈哈哈