我正在努力重新编译一个 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
主.c
#include "a.h"
#include "b.h"
int main()
{
INT i = 10;
return 0;
}
我在带有gcc的Linux中遇到的错误:
In file included from ./main.c,
./b.h:<linenumber>: error: redefinition of typedef ‘INT’
a.h.h:<linenumber>: note: previous declaration of ‘INT’ was here
由于其他变量和函数,我必须包含这两个标头。我没有编写此代码,但这似乎在我的 Solaris 环境中编译,这很奇怪。我能做些什么来解决这个问题?
Solaris 上的本机编译器可能接受您可以重新定义 typedef(可能前提是新的 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
主.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;
}
如果你被允许更改库代码或编译器选项,那么Michael Walz的答案就是要走的路
在它不可更改的不幸情况下,可以通过在包含标头然后取消定义它之前重命名来解决它
#define INT INT_A
#include "a.h"
#undef INT
#define INT INT_B
#include "b.h"
#undef INT
现在只需对a.h
中的所有接口使用 INT_A
而不是 INT
.与b.h
中的INT_B
相同