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.
总结以上是内存溢出为你收集整理的在C中转发声明静态C结构实例全部内容,希望文章能够帮你解决在C中转发声明静态C结构实例所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)