【问题标题】:Extern unnamed struct object definition外部未命名结构对象定义
【发布时间】:2012-07-05 17:21:03
【问题描述】:

我有一个“未命名结构”类型的全局对象,我正在尝试定义它。我不想用这种无用的类型污染我的全局命名空间(它只会使用一次)。

Global.h

extern struct {

    int x;

} A;

有没有正确的方法来定义这样的对象?
我正在尝试这个:

Global.cpp

struct {

    int x;

} A = { 0 };

但是 VS2012 抛出“错误 C2371:'A':重新定义;不同的基本类型”。谢谢。

【问题讨论】:

  • 如果它只使用一次那你为什么要把它放在一个.h文件中?
  • 我在整个项目中都在使用它,它是全球性的。
  • @HansPassant:他只有一个类的instance

标签: c++ struct global-variables extern


【解决方案1】:

一种可能的解决方案:创建另一个不包含 Global.h 的文件 Global_A.cpp,并在那里定义A。根据等效定义规则,这将是有效的,只要匿名结构定义是等效的。

这仍然是一个坏主意,大多数编译器都会警告它,例如(gcc): 警告:非局部变量 ` A' 使用匿名类型

【讨论】:

    【解决方案2】:

    没有办法仅仅因为它容易出错:在未来的某个时候,有人(甚至可能是你)可能想要修改这个结构的定义,他可能会忘记在头文件和源文件中这样做因此。所以你必须为这个结构发明一个名字,并在源文件中使用它的名字,并将它的定义留给标题。

    【讨论】:

      【解决方案3】:

      我不知道这是否对您有帮助,这是我的第一篇文章...所以放轻松。

      我刚刚遇到了这个问题,我所做的就是添加了一个函数,该函数将结构操作到包含匿名结构的文件中。这样我就可以从项目中的任何文件中调用该函数,并为我操纵结构中的值。

      这是一个例子:

      header.c 有这个匿名结构:

       struct 
         {    
             char  line1[80];
             char  line2[80];
             char  line3[80];
         } header;
      

      我想在“interface.c”中操作这些值,因为我正在另一个文件中创建命令行界面。我的第一直觉是使用 extern,但在 header.c 中添加以下函数似乎同样好或更好(有些人在可以避免的情况下不鼓励使用 extern)。

      void changeHeaders(char *one, char *two, char *three);
      void changeHeaders(char *one, char *two, char *three)
      {
      
          strcpy(header.line1, one);
          printf("\nHeader 1: %s", header.line1);
          strcpy(header.line2, two);
          printf("\nHeader 2: %s", header.line2);
          strcpy(header.line3, three);
          printf("\nHeader 3: %s", header.line3);
      
      }
      

      现在只要包含该函数的原型,我就可以使用该函数从任何文件中操作这些结构变量。希望对某人有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-11
        • 2020-12-19
        • 1970-01-01
        • 2021-07-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多