Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > #include внутри namespace


Автор: ANTON_AL 19.8.2007, 11:08
Доброго дня!


Попробовал написать такие строки:

a.h
Код

#pragma once


namespace Platform_Win32
{
    #include <windows.h>
}




main.cpp
Код

#include "a.h"

#include "d3d9.h"   //Header from DirectX SDK
using namespace Platform_Win32;


void main( )
{

}





Студия ушла в себя на 2 минуты, в итоге выдала 277 ошибок:
Код

c:\program files\microsoft directx sdk (april 2007)\include\d3d9.h(58) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
c:\program files\microsoft directx sdk (april 2007)\include\d3d9.h(58) : error C2146: syntax error : missing ';' before identifier 'IID_IDirect3D9'
c:\program files\microsoft directx sdk (april 2007)\include\d3d9.h(58) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
c:\program files\microsoft directx sdk (april 2007)\include\d3d9.h(62) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
c:\program files\microsoft directx sdk (april 2007)\include\d3d9.h(62) : error C2146: syntax error : missing ';' before identifier 'IID_IDirect3DDevice9'
. . .
. . .
. . .




Когда выношу <windows.h> за пределы namespace:
a.h
Код

#pragma once

#include <windows.h>
namespace Platform_Win32
{
    
}

. . . всё собирается без ошибок.


Как такое понимать ??

Автор: archimed7592 19.8.2007, 11:22
Думаю примерно так: в d3d9.h используются typdef'ы из windows.h, но все они находятся в пространстве имён и, соответственно, недоступны в d3d9.h, несмотря на то, что он, возможно, делает собственный #include <windows.h> - стражи #ifndef->#define->#endif делают своё дело.

И ещё, извиняюсь за глупый вопрос: а разве windows.h - это не туева хуча extern "C" конструкций, которым в пространстве имён вроде как(??) не место, а даже если и место, то разве не упадёт линкер при поиске в библиотеке имён с префиксом Platform_Win32::?

Автор: Earnest 20.8.2007, 10:15
Не забывайте о том, что директива #include - это прямая вставка текста. Просишь вставить внутрь пространства имен - какие вопросы, вставим. Только потом без претензий к компилятору, пжлст. 
Макроопределениям же (#define) пространства имен по барабану. А вот все структуры оказываются в нем, в пространстве этом (т.е. ты это компилятору обещаешь), а потом оказывается, что обманываешь. smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)