c - 如何在包含多个头文件时避免重新定义类型



我正在努力重新编译一个 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相同

相关内容

  • 没有找到相关文章

最新更新