【问题标题】:Structure tag and name, why does a local variable declared as name compile?结构标签和名称,为什么声明为名称的局部变量编译?
【发布时间】:2011-05-19 02:00:50
【问题描述】:

在我最近看到的一些代码中,有一个这样定义的结构:

typedef struct tagMyStruct {
    int numberOne;
    int numberTwo;
} MYSTRUCT;

按照我的理解,tagMyStruct 是新的数据类型,MYSTRUCT 是在那里创建的变量。

在另一个地方,它是这样使用的:

MYSTRUCT *pStruct = new MYSTRUCT;

它在 Visual Studio 2010 中编译得很好。有效的 C++ 怎么样?我以为MYSTRUCT 是变量而不是类型?

【问题讨论】:

    标签: c++ c struct language-features


    【解决方案1】:

    没有。 tagMyStruct 是结构的名称。在 C 中,与 C++ 不同,每次使用 struct 类型时都必须显式使用 struct 关键字。例如

    tagMyStruct x; //error
    struct tagMyStruct x; //OK
    

    为了避免一直写结构,struct tagMyStructtypedef'd 到 MYSTRUCT。现在你可以写了

    MYSTRUCT x; //ok, same as struct tagMyStruct x;
    

    您认为这是(变量定义)的内容将没有 typedef 关键字,就像这样

    struct tagMyStruct {
        int numberOne;
        int numberTwo;
    } MYSTRUCT;
    

    顺便说一句

    MYSTRUCT pStruct = new MYSTRUCT; //error cannot convert MYSTRUCT* to MYSTRUCT
    

    无论如何都不是有效的 C 或 C++。也许你的意思是

    MYSTRUCT* pStruct = new MYSTRUCT; //valid C++ (invalid C - use malloc instead of new in C)
    

    【讨论】:

    • @BastiBechtold:它不是一个 & 符号。它是一个星号。和号是 & :)
    • 'new' 从什么时候开始在 C 中有效?此外,值得强调的是,在 C++ 中这种使用 typedef 是不必要的,而且通常是一个坏主意,这正是因为 C++ 不需要像 C 那样使用 struct 关键字作为类型名称的一部分。 (尽管有时您会因为与遗留 C 代码进行互操作而无法使用它。)
    【解决方案2】:
    struct tagMyStruct { ... };
    

    定义了一个名为tagMyStruct的新C++类型(类)。

    struct { ... } MYSTRUCT;
    

    使用给定的结构定义一个名为MYSTRUCT 的变量。

    typedef struct { ... } MYSTRUCT;
    

    定义一个名为 MYSTRUCT 的 typedef,它等效于给定的匿名结构。

    typedef tagMyStruct struct { ... } MYSTRUCT;
    

    定义了一个名为MYSTRUCT 的typedef 和一个名为tagMyStruct 的类型。所以 MYSTRUCT 只是 tagMyStruct 的 typedef。因此,MYSTRUCT pStruct 定义了一个名为pStructtagMyStruct

    您给出的分配无效,因为 new MYSTRUCT 返回一个 指针MYSTRUCT

    【讨论】:

      【解决方案3】:

      你错了,你使用的是typedef,即MYSTRUCTtagMyStruct的别名。这解释了它是如何正确的 c++。

      为了创建一个变量,删除 typedef:

      struct tagMyStruct {
          int numberOne;
          int numberTwo;
      } MYSTRUCT;
      

      【讨论】:

      • 这些是别名 MYSTRUCTtagMystruct 仅在 C++ 中而不在 C 中
      猜你喜欢
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      • 2014-06-23
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多