C ++: Разрешено ли определение пространств имен перед #include <files>. - PullRequest
3 голосов
/ 07 марта 2012

Я использую одно пространство имен в нескольких файлах, и я вставил «namespace abc {» в начале и «}» в конце каждого файла через скрипт (кроме основного).Поэтому «#include» находится под пространством имен в каждом файле. Когда я компилирую, он не работает (не распознавая системные функции и т. Д.).

Но если я определяю пространство имен после строк «#include»,все отлично работает. в чем тут проблема?

Ответы [ 2 ]

5 голосов
/ 07 марта 2012

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

Чтобы привести конкретный пример, допустим, у вас есть заголовок, объявивший функцию int f(int).Включая это в фигурные скобки для пространства имен, вы превращаете это в объявление для int somenamespace::f(int).

Хотя int ::f(int) было определено, int somenamespace::f(int) не имеет, поэтому вы не можете связать.

Обратите внимание, что это не относится к extern "C" функциям.Они в основном игнорируют пространства имен, поэтому (например) что-то вроде:

namespace x {
    #include <stdio.h>
} 

не повлияет на обычные функции C в stdio.h.

1 голос
/ 07 марта 2012

#include строки должны идти перед определениями пространства имен, в противном случае вы можете получить неожиданные результаты.Язык препроцессора отличается от кода c / c ++, и их смешивание может привести к трудным отслеживанию ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...