Не то, чтобы я когда-либо писал свой код в своей профессиональной работе, следующий код является законным и компилируется без предупреждений в С++ и 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/С++: Почему я не могу определить функцию
foo
?
Кажется, я должен был бы определить функциюfoo
; имена функций и имена переменных являются "обычными идентификаторами". Но если я добавлю этот последний бит кода, я получаюerror: redefinition of 'foo' as different kind of symbol
.
Вопрос:foo * foo;
является совершенно законным, поэтому почемуint foo (foo*);
не закончен? -
Вопрос на С++: как это вообще работает на С++?
Значение "пространства имен" в С++ имеет иное значение, чем в C. Я не могу найти ничего в стандарте С++, который говорит о понятии C пространства имен, что и делает законным в C.
Вопрос: Что делает этот законным в С++ (предпочтительнее глава и стих)?