【问题标题】:#define not recognised by library#define 不被库识别
【发布时间】:2018-12-28 11:03:15
【问题描述】:

我正在构建一个库项目和一个测试项目来测试这个库。我希望用户(A.K.A. 测试项目)能够为库定义一些东西,但是我的库中无法识别 #define 并且只会引发错误。

**我将库项目构建为静态库,构建顺序是先构建库,然后构建测试项目,因为项目依赖于库。

在测试项目中,我希望用户能够这样定义(在包含之前):

#define PUT_DEFINE_HERE

在图书馆我只是检查:

#ifdef PUT_DEFINE_HERE
//Do some stuff
#endif

如前所述,库看不到用户定义的#define。我用构建顺序尝试了一些东西,但到目前为止没有运气,有什么想法吗?

【问题讨论】:

  • 所以你首先构建库,然后期望在一些不相关的用户构建中的定义在链接时影响它,对吗?
  • 是头文件 (.h) 还是 .cpp 文件中的“Do some studd”?
  • 正确我首先构建了库,但是是的,它在头文件中。
  • 你得到了什么错误?...
  • 预处理器指令是预编译时的。编译器甚至不会查看禁用的分支,因此如果您的库已经使用特定设置构建,那么您不能在这里做很多事情......如果您希望用户代码能够影响它,请将您的 @987654323 @ 切换到 .h 文件。

标签: c++ c-preprocessor


【解决方案1】:

如果您希望库“接受”用户 #define,请检查 PUT_DEFINE_HERE 是否存在

#ifdef PUT_DEFINE_HERE
//Do some stuff
#endif

必须在标头杆处完成,并且仅在此处完成

其次,包含库头的用户项目必须#define PUT_DEFINE_HERE之前包含库头。

或者,如果这样的设置与库设计不兼容,则必须在编译时添加#define,例如:

gcc -DPUT_DEFINE_HERE ...

在这种情况下,请务必在相关时使用-DPUT_DEFINE_HERE 编译每个源代码。

【讨论】:

  • 是的,我很害怕,有没有办法绕过它,以便在运行时验证存在?
  • #defines 由预处理器处理,因此根据定义,它们不能在运行时检查。也就是说,无论PUT_DEFINE_HERE 是在编译时定义的,您都可以将代码存储在一个变量中。类似#ifdef PUT_DEFINE_HERE bool is_defined=true #else bool is_defined=false #endif
猜你喜欢
  • 2010-11-01
  • 1970-01-01
  • 2021-11-22
  • 2022-01-06
  • 1970-01-01
  • 2019-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多