Не то, чтобы я когда-либо писал код, подобный следующему, в моей профессиональной работе, следующий код является законным и компилируется без предупреждений в c ++ и c:
#include <stdlib.h>
typedef struct foo { int foo; } foo;
foo * alloc_foo () {
return (struct foo*) malloc(sizeof(foo));
}
struct foo * alloc_struct_foo () {
return (foo*) malloc(sizeof(struct foo));
}
foo * make_foo1 (int val) {
foo * foo = alloc_struct_foo ();
foo->foo = 0;
return foo;
}
struct foo * make_foo2 (int val) {
struct foo * foo = alloc_foo();
foo->foo = 0;
return foo;
}
Что делаетэтот законный и недвусмысленный в C раздел 6.2.3 стандарта C:
6.2.3 Пространства имен идентификаторов
Если в любой точке видны более одного объявления определенного идентификатораединица перевода, синтаксический контекст устраняет неоднозначность использования, которое относится к различным объектам.Таким образом, существуют отдельные пространства имен для различных категорий идентификаторов (имена меток; теги структур, объединений и перечислений; членов структур или объединений и обычных идентификаторов).
Обратите внимание, что благодаря меткеимена, живущие в их собственных пространствах имен, я мог бы сделать код еще более запутанным, используя где-нибудь метку foo
.
Добавьте следующее, и код не компилируется:
int foo (foo * ptr) {
return ++ptr->foo;
}
Итак, два вопроса, один из которых касается C и C ++, а другой - C ++.
C / C ++ вопрос: почему я не могу определить функцию foo
?
Кажется, я должен быть в состоянии определить функцию foo
;Имена функций и имена переменных являются «обычными идентификаторами».Но если я добавлю этот последний кусочек кода, я получу error: redefinition of 'foo' as different kind of symbol
.
Вопрос: foo * foo;
совершенно законно, так почему же не int foo (foo*);
законно?
Вопрос C ++: как это вообще работает в C ++?
Значение «пространства имен» приобретает в C ++ совсем другое значение, чем в C. Я не могу найти в стандарте C ++ ничего такого, что говорит о CКонцепция пространств имен, что делает вышеуказанное легальным в C.
Вопрос: Что делает это легальным в C ++ (предпочтительны глава и стих)?