C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在C中转发声明静态C结构实例大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在编写一个@L_450_1@生成器,实际上是一个数据生成器,它将生成这种形式的数据结构(显然,实际的数据结构更精细):

@H_419_8@

@H_419_8@

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编译器都是可移植的.@H_419_8@

我想将这些struct实例声明为static,以免污染全局变量空间,如:@H_419_8@

@H_419_8@

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编译器,但上面的@L_450_1@不适用于C编译器并导致编译错误:@H_419_8@

@H_419_8@

error: redeFinition of ‘Foo f1’
error: ‘Foo f1’ prevIoUsly declared

我理解为什么在C中发生这种情况.是否有一个简单的解决方法,不涉及在运行时使用@L_450_1@来实现可移植到所有C编译器的相同效果,而无需使用C编译器来编译某些文件?@H_419_8@

解决方法

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

@H_419_8@

@H_419_8@

#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.@H_419_8@

大佬总结

以上是大佬教程为你收集整理的在C中转发声明静态C结构实例全部内容,希望文章能够帮你解决在C中转发声明静态C结构实例所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。