我正在重新编译C项目,我不知道如何以正确的方式解决这个问题。 这是一种情况 -
a.h
---
#ifndef A_H
#define A_H
typedef int INT;
// other variables and function definition
#endif
b.h
---
#ifndef B_H
#define B_H
typedef int INT;
// other variables and function definition
#endif
main.c
-------
#include "a.h"
#include "b.h"
int main()
{
INT i = 10;
return 0;
}
我在Linux中使用gcc -
得到的错误包含在./main.c中的文件,
./b.h:<linenumber> : error: redefinition of typedef ‘INT’
a.h.h:<linenumber>: note: previous declaration of ‘INT’ was here
由于其他变量和函数,我必须包含两个标头。我没有编写这段代码,但这似乎是在我的solaris环境中编译的,这很奇怪。我该怎么做才能解决这个问题?
答案 0 :(得分:6)
Solaris上的本机编译器可能接受您可以重新定义一个typedef(可能是新的typedef与之前的类型相同)。
我会引入另一个头文件mytypes.h
,如下所示:
<强> mytypes.h 强>
#ifndef MYTYPES_H
#define MYTYPES_H
typedef int INT;
#endif
在使用mtypes.h
之前包括INT
,甚至可能在main.c
中:
<强> A.H 强>
#ifndef A_H
#define A_H
#include "mytypes.h" // can be removed if INT is not used in a.h
// other variables and function definition
#endif
<强> b.h 强>
#ifndef B_H
#define B_H
#include "mytypes.h" // can be removed if INT is not used in b.h
// other variables and function definition
#endif
<强>的main.c 强>
#include "a.h"
#include "b.h"
#include "mytypes.h" // not really necessary because it's already included
// via a.h and b.h, but still good practice
int main()
{
INT i = 10;
return 0;
}
答案 1 :(得分:0)
如果您被允许更改库代码,或者被允许更改编译器/编译选项,那么Michael Walz的答案是可行的方法
在不幸的情况下,它不可更改,在某些情况下,它可以像这样解决
loop.ensure_future(myCoroutine())
现在,您必须对#define INT INT_A
#include "a.h"
#undef INT
#define INT INT_B
#include "b.h"
#undef INT
中的所有接口使用INT_A
,而不是a.h
。与INT
相同。如果标题以循环方式相互包含,那将会更复杂。