加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在C中转发声明静态C结构实例

发布时间:2020-12-16 10:49:56 所属栏目:百科 来源:网络整理
导读:我正在编写一个代码生成器,实际上是一个数据生成器,它将生成这种形式的数据结构(显然,实际的数据结构更精细): 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
我正在编写一个代码生成器,实际上是一个数据生成器,它将生成这种形式的数据结构(显然,实际的数据结构更精细):

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编译器来编译某些文件?

解决方法

这应该使用C或C进行编译,并为您提供相同的名称,以便在两个编译器中访问相同的内容.

#ifdef __cplusplus
 namespace // use anonymous namespace to avoid poluting namespace.
 {
    struct StaticFoos
    {
       static Foo f1;
       static Foo f2;
    };

    Foo StaticFoos::f1 = {1,&StaticFoos::f2};
    Foo StaticFoos::f2 = {2,&StaticFoos::f1};
 }

 static const &Foo f1 = StaticFoos::f1;
 static const &Foo f2 = StaticFoos::f2;
#else
 static Foo f1 = {1,&f2_};
 static Foo f2 = {1,&f1_};
#endif

现在在C和C中,您可以访问f1和f2.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读