2013-02-22 4 views
0

Я просто столкнулся с условием, когда я # включаю заголовок, я запускаю ошибки компиляции, которые требуют от меня #include заголовков, которые уже были включены в исходный заголовок.При каких условиях заголовки C++ не транзитивны?

Заголовок имеет следующее содержание:

#pragma once 

#include <atlbase.h> 
#include <atlcom.h> 

#include "itestobj.h" 

extern "C" ITestObj* WINAPI GetTestObj(); 

Затем я получаю кучу ATL связанных с ошибками компиляции, когда я код против того, разрешаются путем включения atlbase.h и atlcom.h в файле C++ в дополнение к над заголовком.

Почему эти заголовки не включены, как обычно, это так?

+0

Возможно, вам нужно «#include ' вместо этих внутренних файлов? –

+0

Неправильное размещение файла с предварительно скомпилированными заголовками (stdafx.h) является одной из таких ловушек. Он должен быть включен первым. –

ответ

0

По всей вероятности, хотя бы один из этих заголовков включает файл, который вы показываете в своем сообщении. Начиная с #pramga once, ваш компилятор должен включать его только один раз, он останавливается и вы не получаете все объявления.

+0

Но разве это не означает, что я должен получать 'atlbase.h' и' atlcom.h' из включения, которое не исключается '#pragma once'? – dlanod

+0

Это зависит от того, какой заголовок вы укажете из файла cpp. – bitmask

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