【发布时间】:2009-02-28 17:43:16
【问题描述】:
我正在编写一个代码生成器,嗯,实际上是一个数据生成器,它将生成这种形式的数据结构(显然实际的数据结构要复杂得多):
typedef struct Foo {
int a;
struct Foo* foo;
} Foo;
extern Foo f1;
extern Foo f2;
Foo f1 = {1, &f2};
Foo f2 = {2, &f1};
这对于我尝试过的所有 C 和 C++ 编译器都是可移植的。
我想将这些struct实例转发声明为static,以免污染全局变量空间,如:
typedef struct Foo {
int a;
struct Foo* foo;
} Foo;
static Foo f1;
static Foo f2;
static Foo f1 = {1, &f2};
static Foo f2 = {2, &f1};
虽然这适用于 gcc 和可能所有的 C 编译器,但上述代码不适用于 C++ 编译器并导致编译错误:
error: redefinition of ‘Foo f1’
error: ‘Foo f1’ previously declared
我明白为什么在 C++ 中会发生这种情况。是否有一个简单的解决方法,不涉及在运行时使用代码来实现可移植到所有 C++ 编译器的相同效果,而无需使用 C 编译器来编译某些文件?
【问题讨论】:
-
也许我只是太密集了,但你想达到什么目的?你没有向前声明任何东西,你正在创建 Foo 类型的变量,多次使用相同的名称。但我不确定为什么。为什么不只声明每个变量一次?
-
你不能声明一次变量,因为它们是交叉引用的:static Foo f1 = {1, &f2};静态 Foo f2 = {2, &f1}; - 你必须转发声明。