【问题标题】:extern without type没有类型的外部
【发布时间】:2010-11-08 11:21:45
【问题描述】:

如果extern的语法是

extern <type> <name>;

如果我有一个未命名的一次性结构,我该如何extern

struct {
    char **plymouthThemes;
    char *plymouthTheme;
} global;

我试过了

extern global;

没有任何类型,它不起作用。

或者,我必须命名结构吗?

【问题讨论】:

    标签: c extern


    【解决方案1】:

    您需要命名您的结构并将其放入 .h 文件中,或者在每个使用 global 的源文件中手动包含定义。像这样

    ///glob.h
        struct GlobalStruct
        {
           ///char** ...
           ///
        };
    
    ///glob.cpp
       #include "glob.h"
       struct GlobalStruct global; 
    
    ///someOtherFile.cpp
    #include "glob.h"
    
    extern struct GlobalStruct global; 
    

    【讨论】:

    • 我是否必须在每个我想使用global 的文件中执行此操作?
    • 哦,对不起,我误会了你。如果你想在很多地方使用 global 并声明它们,恐怕你将不得不命名你的结构
    • 现在我遇到的问题是,当我执行 extern struct globalStruct global; 时,其他文件不知道 struct globalStruct 是什么。
    • 当然,你必须包括 GlobalStruct 的定义......让我编辑我的答案
    • 谢谢。我在 C 语言中使用结构和多个文件的技能相当薄弱。
    【解决方案2】:

    如果你不想命名一个结构,有一个通用的方法:

    --- global.h: (file with global struct definition):
    
    #ifdef GLOBAL_HERE /* some macro, which defined in one file only*/
    #define GLOBAL
    #else
    #define GLOBAL extern
    #endif
    
    GLOBAL struct {
        char **plymouthThemes;
        char *plymouthTheme;
    } global;
    
    ---- file1.c (file where you want to have global allocated)
    
    #define GLOBAL_HERE
    #include "global.h"
    
    ---- file2.c (any oher file referencing to global)
    
    #include "global.h"
    

    宏 GLOBAL 是有条件地定义的,因此它的使用将在除定义 GLOBAL_HERE 的源之外的所有位置添加一个带有“extern”的定义。当您定义 GLOBAL_HERE 时,变量将变为非外部变量,因此它将分配在此源的输出对象中。

    还有一个简短的技巧定义(在您分配全局变量的单个 .c 文件中设置):

    #define extern
    

    这会导致预处理器删除 extern(替换为空字符串)。但不要这样做:重新定义标准关键字是不好的

    【讨论】:

      【解决方案3】:

      这个想法是你只需要声明一个,但仍然需要在使用它的每个其他文件中定义变量。该定义包括类型(在您的情况下是一个标头定义结构 - 因此需要包含)和 extern 关键字,以让编译器知道声明位于不同的文件中。

      这是我的例子

      ext.h

      struct mystruct{
          int s,r;
      };
      

      ext1.c

      #include "ext.h"
      
      struct mystruct aaaa;
      
      main(){
          return 0;
      }
      

      ext2.c

      #include "ext.h"
      
      extern struct mystruct aaaa;
      
      void foo(){
          aaaa;
      }
      

      ext3.c

      #include "ext.h"
      
      extern struct mystruct aaaa;
      
      void foo2(){
          aaaa;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-18
        • 2020-10-18
        • 1970-01-01
        • 2018-06-26
        • 1970-01-01
        • 1970-01-01
        • 2015-02-22
        相关资源
        最近更新 更多