struct и typedef в C по сравнению с C ++ - PullRequest
8 голосов
/ 03 ноября 2010

В настоящее время я использую C ++ IDE для чего-то, что должно работать на C, и хотел убедиться, что у меня не будет проблем с этим позже.После создания приведенной ниже структуры:

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

Затем я создаю его экземпляр, используя test my_test;, затем такие вещи, как my_test.a = 5 и т. Д., И это прекрасно работает в моем VStudio C ++.Будет ли это работать на gcc позже?

Я прочитал соответствующие вопросы, которые всплыли (я вижу, что я не первый человек с таким вопросом тоже), но никто, кажется, не использовалКак я.

На самом деле, в чем разница между typedef struct {//stuff} test; и моей версией?

Ответы [ 3 ]

18 голосов
/ 03 ноября 2010
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 хотели бы иметь возможность сделать это третье, но не могут.

18 голосов
/ 03 ноября 2010

Разница между:

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'а анонимной структуры.

7 голосов
/ 03 ноября 2010

И в 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.

...