В каком пространстве имен находится имя typedef? Рассмотрим этот код:
#include <stdio.h>
typedef struct x { // 'x' in tag name space
int x; // 'x' in member name space
int y;
} x; // ??
int main() {
x foo = { 1, 2 };
int x = 3; // 'x' in ordinary identifier name space
printf("%d %d %d\n", foo.x, foo.y, x);
}
Это печатает '1 2 3' с помощью gcc 4.4.7 (и g ++ 4.4.7), поэтому имена типов отделены от имен тегов, членов и обычных идентификаторов.
Этот код также компилируется и запускается на gcc / g ++ 4.4.7, производя '1, 2':
#include <stdio.h>
typedef struct x { // 'x' in tag namespace
int x; // 'x' in member namespace
int y;
} x;
int main() {
x x = { 1, 2 };
printf("%d %d\n", x.x, x.y);
}
Как в этом случае устраняются неоднозначности идентификаторов x
?
EDIT
Уточнение, я надеюсь. Рассмотрим эти две строки сверху:
x foo = { 1, 2 };
int x = 3; // 'x' in ordinary identifier name space
Когда выполняется вторая строка, идентификатор x
находится в области видимости и должен логически находиться в пространстве имен «обычный идентификатор». Похоже, на данный момент нет новой области видимости, потому что между строками 1 и 2 нет открывающей скобки, поэтому вторая x
не может скрыть первую x
, а второй x
ошибочный. В чем недостаток этого аргумента, и как это относится к делу x x
? Мое предположение заключалось в том, что недостатком было то, что имена типов каким-то образом имели другое неочевидное пространство имен, отсюда и название этого вопроса.