2016-01-23 2 views
0

Я пытаюсь понять некоторый код C++, который я наткнулся на Интернет. Это была демонстрация flex от NVIDIA с потрясающим новым симулятором жидкости, и поэтому я немного заглянул в код. Там я видел то, чего не понял: в сцене был класс под названием «Сцена». Он не включал, но он использовал функцию CreateRandomConvex из файла helpers.h. Оба они были включены только в main.cpp, но не использовали ни один из них. Итак, теперь мой вопрос: как класс Scene может получить доступ к функции помощников без его включения? И как компилятор знает, где он может получить функцию CreateRandomConvex, если нет класса Scene?Понимание #includes C++

Код: главная:

#include "B.h" 
#include "A.h" 

int main() 
{ 

} 

Ач (Scene)

#pragma once 
class Scene 
{ 
    void Init() 
    { 
     CreateRandomConvex(); 
    } 
}; 

Bh: (хелперы)

#pragma once 
void CreateRandomConvex() 
{ 
    //calc some stuff 
} 

ответ

1

#include "A.h" буквально означает "вставить содержимое файла" A.h "here".

Так при компиляции основного файла, компилятор видит

void CreateRandomConvex() 
{ 
    //calc some stuff 
} 

class Scene 
{ 
    void Init() 
    { 
     CreateRandomConvex(); 
    } 
}; 

int main() 
{ 

} 

В качестве примечания, имеющие один заголовок зависит от другого, уже будучи включены не очень хорошая практика.

+0

В качестве побочного примечания при компиляции с предварительно скомпилированными заголовками вы всегда можете зависеть от того, что все, что является частью предварительно скомпилированного заголовка, будет включено перед любым другим заголовком. –

+0

Итак, включение не означает: если вы чего-то не знаете, посмотрите на него. Но, скорее: все, что там написано, должно быть написано здесь – Dynamitos

+0

@ Dynamitos Точно. – molbdnilo

0

Чтобы включить A.h в CPP файл, который вы должны включить файл B.h заранее в этом файле CPP.

можно утверждать, что это плохая практика. Но это работает.