C:如何在C

时间:2018-04-11 14:15:17

标签: c gcc

我正在重新编译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环境中编译的,这很奇怪。我该怎么做才能解决这个问题?

2 个答案:

答案 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相同。如果标题以循环方式相互包含,那将会更复杂。