我可能做错了,这是一个很大的问题,为什么它在一个编译器中工作而不是另一个编译器.
我有一个大型的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太漂亮了?
我们拥有经过数十年开发的大型 C 代码库。该代码的特点之一是对函数指针和伪继承的大量依赖。习语(如此处讨论的)如下所示:
typedef struct twod_ {
double x, y;
} twod;
typedef struct threed_ {
twod super;
double z;
} threed;
threed *point_3d;
twod *point_2d = (twod *)point3d;
Run Code Online (Sandbox Code Playgroud)
此时point_2d->x和point_3d->x是同一块内存。
我的问题是:
当然,“如果它没坏,就不要修理它”这句格言值得牢记。然而,目前这并没有真正帮助我们,所以我们认为我们可能需要更深入地重构......
谢谢!