2016-11-22 2 views
0

Код компилируется без ошибок, я хотел бы знать, что представляет собой другая декларирующая функция extern внутри и без пространства имен?вызов функции extern без указания пространства имен

--a.h--

namespace mynamespace { 
    extern void foo(); 
} 

--a.c--

namespace mynamespace { 
    void foo(){ 
     dosomething; 
    }; 
} 

Есть ли опасения, что я должен беспокоиться о том, когда вызова Foo() без с указанием имен?

#include "a.h" 
int main(int argc char *argv) 
    foo() 
} 

вместо

#include "a.h" 
int main(int argc char *argv) 
    mynamespace::foo(); 
} 
+3

* «Есть ли какие-либо опасения, что я должен беспокоиться при вызове foo() без указания пространства имен?» * Попробуйте, вы узнаете очень быстро. Компилятор расскажет вам, что он думает о вашем коде. –

+0

@IgorTandetnik странные вещи в том, что мой компилятор не показывал никаких предупреждений или ошибок, я использую gcc-4.9 на debain. –

+0

Блок перевода, содержащий 'main', как показано, [невозможно компилировать] (http://rextester.com/UQO84160). Если это так, то либо вы также предоставляете объявление 'foo' в глобальном пространстве имен, либо вы используете' namespace mynamespace; 'или' using mynamespace :: foo; 'где-то в коде, который вы не показывали. –

ответ

0

Оказывается, что using namespace mynamespace; уже объявлен в другом заголовочном файле. Поэтому, если один файл содержит заголовочный файл, который уже определил using namespace mynamespace;, текущий файл заголовка также затронет.

Смежные вопросы