Задать вопрос
mrjbom
@mrjbom

Самопроизвольное объявление define'ов в проекта?

У меня есть файл main.cpp, включающий лишь BaseSample.h,
BaseSample.h выглядит так:

#pragma once
#ifdef STB_IMAGE_IMPLEMENTATION
#error "DEFINED INSIDE BASE"
#endif
#include "Helpers/VulkanTexture.h"
#ifdef STB_IMAGE_IMPLEMENTATION
#error "DEFINED AFTER TEXTURE"
#endif
#include "Helpers/VulkanglTFModel.h"

VulkanTexture.h

#pragma once
... // some includes
#ifdef STB_IMAGE_IMPLEMENTATION
#error "DEFINED INSIDE TEXTURE"
#endif

VulkanglTFModel.h

#pragma once

#include "VulkanTexture.h"

#ifdef STB_IMAGE_IMPLEMENTATION
#undef TINYGLTF_NO_STB_IMAGE
#error "DEFINED INSIDE MODEL"
#endif

И по итогу такой конструкции я получаю ошибку DEFINED INSIDE MODEL.
Получается, магическим образом, самопроизвольно, между включениями VulkanTexture.h и VulkanglTFModel.h был объявлен define.
Он точно не объявляется внутри VulkanTexture.h, но в самом начале VulkanglTFModel.h, он каким-то образом оказывается объявлен.
Почему это происходит?
Разве препроцессор не последователен и может включать файлы в том порядке, в каком ему заблагорассудится, а не как я написал?
  • Вопрос задан
  • 75 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Получается, магическим образом, самопроизвольно, между включениями VulkanTexture.h и VulkanglTFModel.h был объявлен define.

А на самом деле где этот define определяется и как это место относится ко всем этим заголовочным файлам?

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

Нет, не может, но возможно ты не вполне понимаешь сам, в каком порядке ты написал их подключение. Так, например, Helpers/VulkanTexture.h и VulkanTexture.h -- это один и тот же файл, или разные? Если один и тот же, то из-за #pragma once в нём он не подключается в VulkanglTFModel.h, а если разные -- то подключается.

Понять, что фактичиски куда подключается можно выполнив вместо шага компиляции только препроцессирование (например, для gcc заменив в команде компиляции ключ -c на -E). В выводе препроцессора не видно дефайнов, но видно когда подключается тот или иной файл и видно весь исходный код не относящийся к препроцессору.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы