分隔特定的 #ifdef 分支

2023-12-25

简而言之:我想从当前的源树中生成两棵不同的源树,仅基于一个已定义的预处理器宏和另一个未定义的预处理器宏,而不对源进行其他更改。

如果你有兴趣的话,这是我的故事......

一开始,我的代码很干净。然后我们做了一个新产品,是的,它更好了。但代码只看到相同的外围设备,因此我们可以保留相同的代码。

嗯,差不多了。

有一个小条件需要改变,所以我补充道:

#if defined(PRODUCT_A)
condition = checkCat();
#elif defined(PRODUCT_B)
condition = checkCat() && checkHat();
#endif

...到一个且仅有一个源文件。在一般的所有源文件包含此头文件中,我有:

#if !(defined(PRODUCT_A)||defined(PRODUCT_B))
#error "Don't make me replace you with a small shell script. RTFM."
#endif

...这样人们就无法编译它,除非他们明确定义了产品类型。

一切都好。哦...除了进行了修改,组件发生了变化,而且由于新硬件工作得更好,我们可以显着地重写控制系统。现在,当我查看代码的表面时,有超过 60 个单独的区域,由以下任一区域划分:

#ifdef PRODUCT_A
...
#else
...
#endif

...或者相同,但是对于PRODUCT_B。甚至:

#if defined(PRODUCT_A)
...
#elif defined(PRODUCT_B)
...
#endif

当然,有时理智需要更长的假期,并且:

#ifdef PRODUCT_A
...
#endif
#ifdef PRODUCT_B
...
#endif

这些条件可以从 1 到两百行(您可能认为最后一个可以通过切换头文件来完成,但函数名称需要相同)。

疯了吧。我最好在源存储库中维护两个独立的基于产品的分支并移植任何常见的更改。我现在意识到了这一点。

有没有什么东西可以生成我需要的两个不同的源树,仅基于PRODUCT_A被定义和PRODUCT_B未定义(反之亦然),without触及其他任何内容(即不包含标头、不宏扩展等)?


我相信Coan http://coan2.sourceforge.net/index.php?page=about会做你正在寻找的事情。从链接:

给定配置和一些源代码,Coan 可以回答一系列问题,即如果提前应用了符号配置,源代码将如何出现在 C/C++ 预处理器中。

并且:

Coan 重写的源代码不是 C 预处理器生成的预处理代码。它仍然包含注释、宏调用和 # 指令。它仍然是源代码,但根据所选配置进行了简化。

因此,您可以运行它两次,首先指定产品 A,然后指定产品 B。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分隔特定的 #ifdef 分支 的相关文章

  • C语言中的宏(#define)

    我正在阅读hoard内存分配器的源代码 在gnuwrapper cpp文件中 有以下代码 define CUSTOM MALLOC x CUSTOM PREFIX malloc x 是什么意思CUSTOM PREFIX malloc x i
  • 可以嵌套 C 预处理器指令吗?

    例如 以下情况是可能的 define definer x define x 不 你不能那样做 英镑 符号在定义中具有不同的含义 这意味着 如果这是一个参数 则通过引用它使其成为一个字符串
  • 如何暂时禁用 C/C++ 中的宏扩展?

    由于某种原因 我需要暂时禁用头文件和 undef MACRONAME将使代码编译 但它将在现有宏下进行 有没有办法禁用它 我应该提到 您并不真正知道宏的值 并且我正在寻找交叉编译器解决方案 至少应该在 GCC 和 MSVC 中工作 在 MS
  • 宏和函数同名

    我有以下代码 define myfunc a b myfunc do a a do b b void myfunc int a int b do blah a b int main int x 6 y 7 myfunc x y return
  • 你能在 C 中#define 注释吗?

    我正在尝试做一个调试系统 但它似乎不起作用 我想要完成的是这样的 ifndef DEBUG define printd else define printd printf endif 有没有办法做到这一点 我有很多调试消息 但我不喜欢这样做
  • 模块化编译时数组扩展

    假设我处于这种情况 main c include
  • 宏定义确定大端还是小端机?

    是否有一行宏定义来确定机器的字节顺序 我正在使用以下代码 但将其转换为宏会太长 unsigned char test endian void int test var 1 unsigned char test endian unsigned
  • 宏展开错误

    我一直在尝试理解宏扩展 发现第二个 printf 给出了错误 我期望第二个打印语句生成与第一个打印语句相同的输出 我知道有一些函数可以进行字符串连接 我发现很难理解为什么第一个打印语句有效而第二个则无效 define CAT str1 st
  • 无与伦比的括号宏怪异

    根据 C99 规则预处理以下 3 行的正确输出是什么 define y x x define x a y a x 1 x 2 顺便说一句 linux 下的 cpp 会产生错误消息 但我不明白为什么答案不简单 1 2 假设 cpp 是正确的而
  • #ifdef MACRO 相当于注释吗

    假设 MACRO 没有定义 这些是等价的 ifdef MACRO Not valid C or C code endif Not valid C or C code 在 GCC 4 7 1 中 它似乎是等效的 但是否有预处理器可以做更多的事
  • 在 C 中使用 #if 进行转换

    为什么这段代码会出错 include
  • C 中类似函数的宏定义

    我想定义一个像 MACRO 这样的函数 IE define foo x if x gt 32 x else 2 x endif 那是 if x gt 32 then foo x present x else foo x present 2
  • 在 C 或 C++ 中使用逗号作为宏名称

    我想做这样的事情 define define MAX 10 000 000 undef 有什么技巧可以做到吗 编辑 我知道 C 14 中的数字分隔符 我正在寻找一种技巧来对不兼容的编译器执行相同的操作 EDIT2 请考虑Variadic M
  • #pragma pack(16) 和 #pragma pack(8) 的效果总是相同吗?

    我正在尝试使用来对齐数据成员 pragma pack n http msdn microsoft com en us library 2e70t5y1 28v vs 100 29 aspx 以下面为例 include
  • Objective-C 字符串文字的预处理器宏值

    我在构建设置中定义了一个预处理器宏 FOO BAR 我想将该值转换为可以传递给方法的 Objective C 字符串文字 以下 define 不起作用 但它应该展示我想要实现的目标 define FOOLITERAL FOO want FO
  • 为什么大多数 C 开发人员使用 Define 而不是 const? [复制]

    这个问题在这里已经有答案了 在许多程序中 define与常量具有相同的用途 例如 define FIELD WIDTH 10 const int fieldWidth 10 我通常认为第一种形式优于另一种形式 它依赖于预处理器来处理基本上是
  • 定义一个断言,即使定义了 NDEBUG,该断言也有效

    我想定义一个assert与标准相同的宏assert 3 http man7 org linux man pages man3 assert 3 html调用 但它不会被预处理器删除NDEBUG被定义为 这样的呼唤 让我们称之为assert2
  • 如何在 C 预处理器中可靠地检测 Mac OS X、iOS、Linux、Windows? [复制]

    这个问题在这里已经有答案了 如果有一些跨平台 C C 代码需要在 Mac OS X iOS Linux Windows 上编译 我如何在预处理器过程中可靠地检测到它们 大多数编译器都使用预定义的宏 您可以找到列表here http sour
  • NDEBUG 预处理器宏的用途是什么(在不同平台上)?

    我感兴趣的是各种平台 编译器 实现 框架分配给C和 C 预处理器宏NDEBUG The CC 标准只提到这个定义一次 即控制assert macro 我要求仅包含具体答案 您可以在其中know某个平台 框架 库C或 C 使用NDEBUG定义
  • 如果未定义则跳过函数调用

    我有一个由不同模块组成的程序 模块通过函数调用互连 例如 State Init 调用各个模块的 init 函数 应可以禁用模块 从编译中排除 最简单的方法是使用预处理器定义 但这会生成大量代码 IF MODULE XXX COMPILE r

随机推荐