Пробелы имен в c++ и c

Не то, чтобы я когда-либо писал код, как следующее в моей профессиональной работе, следующий код является легальным и компилируется без предупреждений в 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 ; имена функций и переменных являются «обычными идентификаторами». Но если я добавлю этот последний кусочек кода, я получу ошибку: переопределение «foo» как символа другого типа .
    Вопрос: foo * foo; совершенно легален, поэтому почему int foo (foo *); легален?

  • C++ вопрос: Как это вообще работает в C++?
    Значение термина «пространство имен» в C++ имеет довольно иное значение, чем в C. Я не могу найти ничего в стандарте C++, который говорит о понятии С мест имен, что делает вышеуказанное законным в C.
    Вопрос: Что делает это законным в C++ (глава и стих предпочтительны)?

-121--1191719- Как остановить преобразование Coldfusion имен столбцов запроса в верхний регистр? При выборе данных из таблицы MySQL с помощью тэга cfquery в ColdFusion 8 все имена столбцов Есть ли...

При выборе данных из таблицы MySQL с помощью тэга cfquery в ColdFusion 8 все имена столбцов преобразуются в верхний регистр, даже если они сохранены в camelCase в таблице базы данных. Существует ли способ обеспечения уважения ColdFusion к именам столбцов?

Причина, по которой я спрашиваю, заключается в том, что я возвращаю результат запроса в виде объекта JSON и не хочу использовать имена свойств верхнего регистра на стороне JavaScript, поскольку я резервирую это соглашение об именовании для констант.

7
задан Jens Wegar 29 September 2011 в 12:58
поделиться