2014-01-06 5 views
5

Я прочитал статью в следующей ссылкеСоздание переменной структуры с использованием имени тега

http://www.embedded.com/electronics-blogs/programming-pointers/4024450/Tag-vs-Type-Names

Здесь автор говорит, что использование follwing неправильно.

struct s 
{ 
-- 
}; 

s var; 

Но в моем примере кода его работы отлично.

1 #include<iostream> 
    2 using namespace std; 
    3 
    4 struct s 
    5 { 
    6 int sd; 
    7 }; 
    8 s v; 
    9 
10 
11 
12 int main() 
13 { 
14 
15 v.sd=10; 
16 cout<<v.sd; 
17 return 0; 
18 } 

EDIT:

Что фактическая разница? Почему он работает в C++ и не работает в c;

+3

Это работает на C++, но не в C – user1781290

+0

Вы пропустили полуколумбу в приведенном выше примере по ошибке? –

+0

Нет, я использовал в своем коде –

ответ

11

Это разница между C++ и C. Автор, которого вы цитируете, говорит о C, когда вы используете код C++ вместо кода C. В C вы должны указать ключевое слово struct, union или enum перед объявлением переменных типов соответствия.

+0

Также я хотел бы добавить, что имена тегов в C образуют собственное пространство имен. Поэтому одно и то же имя можно использовать с тегом структуры и переменной. –

+0

- это теги в C++, которые считаются нормальным идентификатором ... Обычно в c его не я правильно @Vlad –

+0

В структурах C++, объединениях и именах перечислений, рассматриваемых вместе с именами переменных. Если, например, имя структуры coinside с именем переменной, то имя переменной (или функции) скрывает имя структуры. В этом случае вы должны использовать уточненное имя структуры, например struct A {}; A A;/* это правильное определение */A = (struct A)();/* использование уточненного имени */ –

1

В статье говорится о том, что тип, определяемый пользователем с помощью

struct s { 
    ... 
}; 

определяет имя тегs. Чтобы назвать фактический тип, вы можете написать struct s (C или C++) или class s (только C++), но C++ делает оба ключевых слова необязательными (и почти никогда не используются). Поэтому всякий раз, когда вы пишете s в C++, он на самом деле интерпретируется как правильный тип, а в C ключевое слово обязано назвать тип.

Короче говоря: в C++ нет разницы в написании struct s, class s или s, все они означают то же самое.

Для того, чтобы определить имя s типа в C/C++ общий заголовок, один обычно пишет

typedef struct { 
    ... 
} s; 

Тогда тип s может быть использован как в C и C++, без необходимости писать struct.

+0

http://coliru.stacked-crooked.com/a/b071707eb46e1a31 Фактически, в 7.1.3/5 явно указано, что то, что вы говорите, является недопустимым C++. 7.1.3/3 прямо заявляет, что другая тоже действительна :) –

+0

О ... Тогда я помню что-то не так. Однажды я попытался определить структуру в общем C++/CL общем заголовке (не C), а в CL что-то не работает, что обычно работает в общих заголовках C/C++. Мое обходное решение заключалось в том, чтобы явно указать структуру и typedef разные имена. Спасибо за указание на это; Я удалю часть из моего ответа. – leemes

Смежные вопросы