我可能做错了,这是一个很大的问题,为什么它在一个编译器中工作而不是另一个编译器.
我有一个大型的C应用程序,我试图遵循不包括其他头文件中的头文件的样式.相反,使用前向声明; 因此我正在尝试以下方面.
// in A.h
typedef struct A_ A;
typedef struct B_ B;
struct A_ {
double a;
B *b;
};
// in B.h
typedef struct B_ B;
struct B_ {
int c;
};
// in C.h
typedef struct A_ A;
typedef struct B_ B;
void function_do_something(A*, B*);
// in C.c
#include "A.h"
#include "B.h"
#include "C.h"
void function_do_something(A* a, B* b) {
...
}
Run Code Online (Sandbox Code Playgroud)
这个范例在Ubuntu 11.10 gcc中编译和运行 - 但是它给OpenSUSE gcc中的编译器错误提供了"重新定义typedef".
我一直在Ubunutu进行开发,所以没有意识到这种范式可能是错误的.是不是这是完全错的,Ubuntu的gcc太漂亮了?
在我的工作中,我使用适用于许多平台(Windows,嵌入式微控制器,Arduino等)的许多不同的编译器。现在,我想编写一个通用例程,该例程应适用于所有这些例程,但是我与数据类型发生冲突。它主要是低级的东西,所以我想使用'byte','word','bool'等类型。
对于某些编译器,尚未定义这些类型,但对于某些编译器,则已定义这些类型,在这种情况下,这将导致类型冲突的错误。
我了解到typedef比#define更受青睐。在这个问题中,很明显没有办法进行条件typedef。
我已经考虑过使用唯一类型,例如:
typedef unsigned char mybyte
typedef unsigned short int myword
etc...
Run Code Online (Sandbox Code Playgroud)
但这会使我的源代码看起来非常丑陋,恕我直言。