小编BrT*_*BrT的帖子

重新定义typedef

我可能做错了,这是一个很大的问题,为什么它在一个编译器中工作而不是另一个编译器.

我有一个大型的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 gcc typedef

19
推荐指数
2
解决办法
4万
查看次数

C 中的继承:好、坏还是其他?

我们拥有经过数十年开发的大型 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->xpoint_3d->x是同一块内存。

我的问题是:

  • 这个习惯用法在现代生产代码中仍然流行吗?(任何推荐的开源示例)
  • 这段代码对性能有要求——这个习惯对速度和/或内存使用有帮助吗?
  • 它的实现方式(或者由于多年的代码膨胀)现在感觉有点像意大利面条代码——一般来说,这是实现的问题,还是习惯用法的问题?或者换句话说,在理想的情况下,500k LOC 这个习语会很快被理解吗?

当然,“如果它没坏,就不要修理它”这句格言值得牢记。然而,目前这并没有真正帮助我们,所以我们认为我们可能需要更深入地重构......

谢谢!

c oop

5
推荐指数
1
解决办法
519
查看次数

标签 统计

c ×2

gcc ×1

oop ×1

typedef ×1