Typedef-name конфликтует с тегом struct в C ++
Это мое второе исследование об объявлении структуры в C ++. (ПервыйВот) Но теперь я наткнулсяэта почта, В частности, я не уверен, почему это прекрасно в C, но не в C ++.
typedef struct{
int one;
int two;
}myStruct;
struct myStruct; //forward declaration fails
void blah(myStruct* pStruct);
Приведенный выше код прекрасно компилируется на моем Ubuntu box с GCC. Я считаю, что это потому, что первыйmyStruct
живет в нормальном пространстве имен, где живут функции, имена переменных. ВторойmyStruct
живет вТег Пространство имен. Когда компилятор видитmyStruct*
в прототипе функции, он ищет в обоих пространствах имен и нашелmyStruct
в нормальном пространстве и это имя случаетсяtypedef
имя, поэтому он может быть допустимым спецификатором типа. ВторойmyStruct
позже может быть определено как то, что программист хочет. Там не будет никакой путаницы / столкновения с первымненазванный myStruct
так как программист должен использоватьstruct myStruct
сослаться на второй.
Но в C ++, согласно обсуждению, найденному всвязанный вопросНасколько я понимаю, что первыйЬурейеЕ myStruct
живет в нормальном пространстве имен как обычно. ВторойmyStruct
также живет в нормальном пространстве имен (без конкретныхтег пространство имен в C ++?), но может быть омрачено другими идентификаторами. Итак, мой вопрос, почему бы не первыйmyStruct
который находится в том же пространстве имен, что и второйmyStruct
тень второйmyStruct
?
В более общем смысле, кроме явных пространств имен, введенных программистом с использованием средства пространства имен, предоставляемого языком C ++, существуют ли заранее определенные пространства имен, устраняющие неоднозначность использования идентификаторов (включая теги, метки, имена typedef, идентификаторы объектов / функций) как в C? (C имеет 4 предопределенных пространства имен, найденных в моем первом исследовании). Могу ли я найти их в стандарте C ++, указав, где эти имена принадлежат?
РЕДАКТИРОВАТЬКажется, я не задал вопрос достаточно ясно. Все, что я хочу знать, это
1) К каким пространствам имен (если таковые определены в языке) относятся Lables, имена typedef, имена тегов struct / union / enum, нормальная функция, нормальная переменная / имя объекта? (Если я пропустил другие названия, пожалуйста, добавьте.)
2) Почему обычное имя функции, обычное имя переменной, имена теневых тегов, а имена тегов - НЕ.
3) Если есть какие-либо предложения в C ++, которые определяют пространства имен, как в C (Раздел 6.2.1)