C ++ с использованием кода C с использованием двойного подчеркивания в определениях и идентификаторах - PullRequest
1 голос
/ 20 июля 2011

Я понимаю, что в C ++ двойные подчеркивания в идентификаторах зарезервированы для компилятора.У меня есть некоторый код C, который имеет характеристики, аналогичные описанным в соответствующих файлах заголовков:

extern "C" {
    #define HELLO__THERE 1
    int hello__out__there( int );
}

Я буду использовать этот заголовок в проекте C ++ и планирую делать вещи на C ++, например:

if (HELLO__THERE == abc) 
    hello__out__there(foo);

Это допустимое поведение в C ++, охватываемое стандартом?

Ответы [ 4 ]

12 голосов
/ 20 июля 2011

В стандарте C ++ 03 17.4.3.1.2 Global names это использование подчеркивания определяется как зарезервированное:

Каждое имя, которое содержит двойное подчеркивание (_ _) илиначинается с подчеркивания, за которым следует заглавная буква (2.11), зарезервированная для реализации для любого использования.

Зарезервировано означает, что это может использоваться в любой соответствующей реализациии поэтому не рекомендуется использовать его.

2 голосов
/ 20 июля 2011

С вами все будет в порядке, если только по какой-то случайности один из определений не вступит в конфликт с вашим компилятором. Если это так, то, скорее всего, будет предупреждение или ошибка (в зависимости от конфигурации вашего компилятора), что будет повторяющийся символ.

Надеюсь, это поможет. Ура!

0 голосов
/ 20 июля 2011

двойные подчеркивания в идентификаторах зарезервированы для компилятора

Во-первых, это подчеркивание Я думаю.Во вторых такие идентификаторы зарезервированы.Это не сдерживает, чтобы не использовать его.Вы можете использовать его ( до тех пор, пока не возникнет конфликт имен ).

Это допустимое поведение в C ++, охватываемое стандартом?

Да,Это приемлемоТем не менее, есть разница между приемлемым и хорошим кодом.Если вы следуете надлежащим правилам кодирования, тогда ваш код будет хорошим и приемлемым.ИМХО, вы должны обратиться к некоторым хорошим стандартам кодирования в Интернете;это вам очень поможет.

0 голосов
/ 20 июля 2011

Вызов метода был бы в порядке, но зачем сравнивать HELLO_THERE с некоторым значением abc? Если бы вы тестировали, чтобы увидеть, существует ли метод, я бы обернул его в #ifdef ... #endif, потому что если hello_ out _there не определен по какой-то причине, что будет ошибкой компиляции.

...