gpt4 book ai didi

c++ - 是否可以对所有翻译单元进行定义?

转载 作者:行者123 更新时间:2023-12-01 14:40:14 31 4
gpt4 key购买 nike

是否可以在所有翻译单元中进行#define 或类似的预处理器定义?

header 实现对于非常小的库很有用,因为所有代码都可以包含在具有以下结构的单个 header 中并分发:

// library.h

void libFunc(); // forward decl

#ifdef IMPLEMENT_LIBRARY
int libState;
volatile int libVolState; // library state exposed to external processes
void libFunc(){
// definition
}
#endif

然而,这种结构要求用户在头文件仅包含在他们的一个翻译单元中之前定义IMPLEMENT_LIBRARY,这意味着它不能放在用户的头文件中,并且可能有点困惑对于不完全熟悉 C++ 编译规则的人。

如果有一种方法可以在所有 TU 中定义 IMPLEMENT_LIBRARY,这可以自动完成

#ifndef IMPLEMENT_LIBRARY
#defineToAllUnits IMPLEMENT_LIBRARY
// library state
// definitions
#endif

是否存在这样的机制,或者当前的单 header 系统是否已经达到预期的效果?

最佳答案

一些编译单元很可能在包含 #defineToAllUnits 的单元之前编译,所以这是不可能的。

在实践中,您的问题通常通过使用构建系统将 -DIMPLEMENTAT_LIBRARY 选项传递给编译器(或等效语法)来解决。另一种可能性,在尝试通过多个定义实现广泛的可移植性时很常见,是在任何地方都包含一个像 config.h 这样的配置头文件。该 header 可以在配置时自动生成。

您还可以通过使用内联 函数和变量来避免违反 ODR。

关于c++ - 是否可以对所有翻译单元进行定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59139729/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com