制作编译时 运行 的宏版本文件

Make a version file of macros which run at compile time

我想问我是否可以制作一个基本上在编译时定义的宏文件,并在我的 c++ 代码中使用这些宏,如果条件为真,它会编译特定代码。那么该文件的扩展名基本上是 .txt 文件还是 .h 文件。以及如何将此文件放入 CmakeList.txt 以使其在编译时可执行。例如在特定文件中这样?

#define melodic 1
#define noetic 2

C++宏是编写代码的捷径,编译项目时出现的是这段代码:

#define SOMETHING 32
int i = SOMETHING

编译前改为:

int i = 32

因此,无论您将文本放在何处,宏都会替换文本。还有另一种使用宏的方法,这可能正是您正在寻找的。您可以使用预处理指令 #ifdef MACRO 有条件地编译一些代码。例如,假设您有一个仅用于调试的功能,但您不希望该代码使其发布。你可以这样定义它:

void hello() {
#ifdef DEBUG
    print("debug");
#endif
}

然后,如果该文件在 和 #ifdef 宏之前有 #define DEBUG ,代码将被包含。否则,代码将被丢弃。请注意,要使用 #ifdef,宏主体可能为空或不为空,它只是检查是否使用了定义的指令。

您可能想要完成的是在单独的配置文件中设置或不设置一系列预处理器宏,以更改生成的代码。它们是非常强大的工具,但必须谨慎使用,因为使用过多会使代码的可读性降低。

为此,您需要将 #define MACRO 包含在您正在检查它是否已定义的 同一文件 中,并且 before你检查一下。如果你只在那个文件中使用那个宏,最好把它放在它的顶部,但如果你在多个文件中使用它,你可以创建一个头文件 (.h) 并使用 #include "name.h",因为 include 将头文件的内容复制到那里,因此将宏定义添加到您的文件中。

预处理器指令取决于编译器,因此您使用的编译器版本和类型(gcc、clang...)对它们的支持会有所不同。但是,defined 和 ifdef 分布非常广泛,大多数(如果不是全部)编译器都有它们。我建议阅读更多关于指令的内容,例如 here.

最后,如果您使用 .h 文件,您可以像项目中的任何其他头文件一样将其添加到 CmakeList.txt。