【问题标题】:struct and typedef in C versus C++C 与 C++ 中的 struct 和 typedef
【发布时间】:2011-05-04 05:39:25
【问题描述】:

我目前正在使用 C++ IDE 来处理需要在 C 上工作的东西,并希望确保以后不会遇到问题。制作以下结构后:

typedef struct test {
   int a;
   int b;
};

然后我使用它创建一个实例 test my_test; 然后是 my_test.a = 5 之类的东西......这在我的 VStudio C++ 中运行良好。 这会在以后对gcc 起作用吗?

我阅读了弹出的相关问题(我发现我也不是第一个提出此类问题的人)但似乎没有人使用我的方式。

其实typedef struct {//stuff} test;和我的版本有什么区别?

【问题讨论】:

  • 您可以通过打开命令提示符并键入:gcc FilePath/foo.c来编译您的程序。
  • typedef struct vs struct definitions 的可能重复我写了一个关于 C 和 C++ 中这两个结构的差异以及具体和实际含义的广泛答案,作为对链接问题的答案。阅读它以获取已接受答案中未提供的详细信息。

标签: c++ c struct typedef


【解决方案1】:
typedef struct THIS_IS_A_TAG
{
    int a;
    int b;
} THIS_IS_A_TYPEDEF;

THIS_IS_A_TYPEDEF object1;     // declare an object.       C:Ok,     C++:Ok
struct THIS_IS_A_TAG object2;  // declare another object.  C:Ok,     C++:Ok
THIS_IS_A_TAG object3;         // declare another object.  C:Not Ok, C++:Ok

之所以使用 typedef,是因为 C 程序员希望能够做第三件事,但他们做不到。

【讨论】:

    【解决方案2】:

    两者的区别:

    struct Name {};
    

    typedef struct Name {} Name;
    

    在C语言中,你需要使用:

    struct Name instance_name;
    

    使用前者,而使用后者你可以这样做:

    Name instance_name;
    

    在 C++ 中,无论哪种情况都不需要重复 struct 关键字。请注意,您创建没有名称的 typedef(即typedef struct Name{};)的示例是非标准的 AFAIK(如果您使用关键字 typedef,那么您需要提供一个别名来 typedef 该名称)。

    至于最后一个变化:

    typedef struct { /* ... */ } Name;
    

    上面的代码创建了一个别名为 Name 的未命名结构。您可以像使用 typedef struct Name { /* ... */ } Name; 一样使用这样的结构,但是编译器通常会发出结构的名称(而不是别名),因此如果您给它一个名称和typedef 与 typedef 匿名结构相反。

    【讨论】:

    • 我刚刚注意到“警告'typedef':在没有声明变量时在'test'左侧被忽略”是我按照我在原始代码sn-p中编写的方式做事时得到的.这引出了一个问题,我写的东西到底是做什么的?
    • @user472875:什么都没有。这就像写“typedef int;”。或者就像在字典中写一个定义而不给出那个意思的词。
    【解决方案3】:

    在 C 和 C++ 中,示例构造都毫无意义:

    typedef struct test {
       int a;
       int b;
    };
    

    在 C 中,这表示有一个类型 struct test,其中两个整数作为内容。如果在右大括号“}”和分号“;”之间有一个名称,那么您将从关键字typedef 中获得一些好处;就目前而言,关键字typedef 是多余的,并且(如果设置得足够繁琐),GCC 会警告您。

    在 C++ 中,这表示有一个类型 struct test;此外,在 C++ 中,它也创建了一个类型 test(这在 C 中不会发生)。关键字typedef 仍然可以省略,也可以得到相同的结果。

    语法合法;它没有用,仅此而已。关键字typedef可以省略,丝毫不会改变程序的含义。

    你可以这样做:

    typedef struct test {
       int a;
       int b;
    } test;
    

    现在,在 C 和 C++ 中,您都有一个类型 struct test 和它的别名 test

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      相关资源
      最近更新 更多