2015-10-31 3 views
2

Так что я делаю некоторые базовые вещи OpenGL и для своих математических функций, таких как векторы, матрицы, я использую библиотеку GLM. Я создал файл заголовка, который должен работать с указанной библиотекой, и я заметил, что он компилируется и работает по назначению, даже не включая необходимые файлы заголовков GLM-библиотеки.Сборка программы, хотя я не включаю необходимые заголовки?

Моей упрощенный пример программа:

main.cpp

#include <glm.hpp> 
#include <gtc/matrix_transform.hpp> 
#include <gtc/type_ptr.hpp> 
#include "Header.h" 

int main(int argc, char* args[]){ 
    Header::test(); 
    return 0; 
} 

header.h

#pragma once 
#include <iostream> 

namespace Header { 
    void test() { 
     glm::vec3 vec = glm::vec3(1.0f, 5.0f, 1.0f); 
     std::cout << vec.x << std::endl; 
     std::cout << vec.y << std::endl; 
    } 
}; 

Моего выход:

Как это возможно, что мне не нужно включать GLM-заголовки в моем файле «header.h»?

+0

'# include' просто помещает текст в файл в то же postition как включить заявление, что вы на самом деле включают GLM заголовки перед callingthe функции – user463035818

ответ

2

Для программ на С ++ компилятор только компилирует файлы .cpp как единое целое. Файлы заголовков «включены» в файлы .cpp.

Поэтому компилятор компилирует Main.cpp и когда компилятор видит #include "Header.h", он заменяет строку #include содержимым этого файла.

Из-за того, как это работает, заголовочный файл не должен включать все необходимое. Это связано с тем, что он был включен в файл cpp перед вашим файлом заголовка.

Некоторые причуды по этому поводу:

  1. Если вы #include "Header.h" в другом файле .cpp, который не имеет файлы заголовков GLM перед ним, то он не будет компилировать.

  2. Если вы взяли файл Header.h и переименовали его в файл .cpp, это не сработает, потому что тогда компилятор попытается скомпилировать его как свой собственный блок (что не удастся, поскольку файлы GLM не будут там).

3

.h Файлы не скомпилированы. Поскольку вы сначала включаете заголовки glm, когда файл header.h включен в cpp, glm уже включен. Если вы попытались включить заголовок в отдельный cpp, который не имел #include <glm.hpp>, он потерпит неудачу.

+0

Будет ли это работать как хорошо, если header.h был класс с его .cpp файл? –

2

Вы уже включили заголовки GLM, прежде чем включить Header.h.

Компиляция - ваш Main.cpp файл; файлы заголовков не компилируются отдельно.

C-Preprocessor cpp обрабатывает все операторы # перед попыткой компиляции. Попробуйте запустить cpp Main.cpp: это покажет исходный файл, который на самом деле скомпилирует g++.