gpt4 book ai didi

关于缺少预处理器符号的编译器警告

转载 作者:太空狗 更新时间:2023-10-29 15:26:21 26 4
gpt4 key购买 nike

<分区>

背景

我有一个C项目,它有一个配置头文件,例如:

// config.h
#define FEATURE_1_AVAILABLE 1
#define FEATURE_2_AVAILABLE 0
#define FEATURE_3_AVAILABLE 1

模块使用这些标志在构建中包含/排除功能:

#include "config.h"
void foo(void) {
...
#if FEATURE_1_AVAILABLE
useFeature1();
#endif
...

对于不同的构建,config.h 有不同的版本。

问题

#include "config.h" 被意外删除,因此即使在配置中启用该功能也未激活。

不幸的是,#if FEATURE_1_AVAILABLE 在未定义时静默计算为 0。因此,如果未定义,我需要一个错误。

选项 1

我可以在每个条件上添加额外的“如果已定义”测试。

#ifndef FEATURE_1_AVAILABLE
#error No feature 1
#elif FEATURE_1_AVAILABLE
useFeature1();
#endif

缺点是一个功能标志可能会在模块中的许多不同位置进行测试,并且添加多个预处理器行不会使代码更漂亮。

选项 2

在模块开头添加单个测试:

#ifndef FEATURE_1_AVAILABLE
#error No feature 1
#endif

但这可能会丢失/忘记,原因与 #include "config.h" 相同。

选项 3

将标志定义为宏:

#define FEATURE_1_AVAILABLE()      1

并用作:

#if FEATURE_1_AVAILABLE()

不幸的是,如果您忘记了括号,这也会默默地失败:

#if FEATURE_1_AVAILABLE

选项 X

还有更好的选择吗?如果符号未定义或写入不正确,则会在编译时给出错误消息。希望不会让代码看起来无法维护,预处理器一团糟。

其他

  • 运行时检查是不可能的。禁用的功能不得在二进制文件中。
  • 功能必须在文件中定义。将它们定义为全局编译器选项还有其他问题。
  • 这适用于嵌入式系统。其中一些功能需要硬件才能工作,测试非常耗时。所以在编译时有错误是首选。

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