包含 headers 时防止多个 #define

Preventing multiple #define when including headers

来自 python,我对正确的方法有点迷惑。

我正在尝试将此库包含在我的项目中: https://github.com/nothings/stb/blob/master/stb_image.h

为此,我必须在导入文件之前 #define STB_IMAGE_IMPLEMENTATION 恰好一次(根据该文件的文档)

这是有道理的,我感到困惑的是,我有 CLASS.h/cpp 并且在 .h 中我定义了使用该文件中的 typedef 的函数,所以我有

#define STB_IMAGE_IMPLEMENTATION

#include <stb_image.h> 

在那个 header 文件中,并且不能将这些行移动到 .cpp,因为 headers 需要函数 def 的定义,但是一旦另一个文件包含这个 header,(我相信#ifndef 不会有帮助),它将被定义两次

我有一个结构,其中 TOP 创建了上面的 CLASS,但是 parent 也创建了 OTHER,而 OTHER 需要包括 PARENT,其中包括 CLASS,这触发问题(并阻止我将#define 移动到 PARENT)注意实际的 class 结构比这个更复杂,但这个想法似乎是一个核心问题,我正在寻找一般最佳实践。

那么,有什么方法可以确保这些#defines 在其他任何事情之前定义,并且只定义一次吗?这似乎是一件基本的事情,但我想不通 - 什么是最好的方法?

此代码是一个库,如果重要的话没有定义的条目

创建一个 cpp 文件(或您为源文件使用的任何扩展名),其唯一目的是

#define STB_IMAGE_IMPLEMENTATION

#include <stb_image.h> 

并且不要忘记将此 cpp 文件包含到您的项目中,以便对其进行编译并将结果链接到您的程序中。在您需要此库的所有其他地方,只需像往常一样包含 stb_image.h header。

这些“实现”宏是一些库作者用来使“安装”他们的库变得容易的“技巧”。这个想法是,当一个特定的宏(由库作者选择)在包含该库的 header 之前定义时,将添加一些具有实际实现的代码。这就是为什么它必须在一个源文件而不是 header 中并且只能在一个源文件中(否则你会得到相同函数的多个定义)。

您应该在一个包含 <stb_image.h> 的源文件中包含 #define STB_IMAGE_IMPLEMENTATION 宏定义(.cpp 文件,而不是 header)。

因为您也只能有一个定义 main() 的源文件,所以将 #define 放在与 main() 相同的文件中很简单(只要它还包括<stb_image.h>),但如果您愿意,它可以用于任何其他源文件。您甚至可以创建一个仅包含所示两行的源文件 stb_image_imp.cpp,并将其 link 也放入您的程序(或库)中。

项目中的所有其他源文件应仅包含 <stb_image.h> 而无需同时定义宏。

#define 是一个预处理器指令,实际上并没有在每次访问 header 时得到 运行,所以你应该 没问题

如果您使用的是visual studio,您也可以执行#pragma once 以仅解析一次文件,从而阻止任何事情发生两次