gpt4 book ai didi

c++ - 是否可以根据宏或变量有条件地编译/运行代码?

转载 作者:太空狗 更新时间:2023-10-29 20:30:34 28 4
gpt4 key购买 nike

我们有几个开发项目共享相同的代码库。某些代码片段仅与其中一个或其他项目相关。

我们有几个要求:

第一个要求是我们希望我们的最终版本不编译来自其他项目的代码。

一种解决方案(我们喜欢的一种)是使用预处理器删除该代码:(这就是我们在某些地方所做的)。

#if defined PROJECT1
{
// some code
}
#endif

第二个要求是,在我们开发的过程中,确保代码更改仍然适用于所有项目是有帮助的,因此我们希望一次编译所有项目代码,并能够在两者之间切换没有重新编译的项目 - 所以在我们代码的其他地方,我们使用变量来确定项目:

if (project == 1)
{
// some code
}

我想做的是结合两者的优点 - 在某些情况下(假设由 #define REMOVECODE 确定)代码根本不包含在最终的 exe 中,但在其他情况下(由REMOVECODE定义的非定义决定)将代码包含在编译后的.exe中

还有一件事 - 有时我们的代码存在于几个项目中,因此解决方案需要处理像“if project == 1 || project == 2”这样的测试

我认为它看起来像下面这样(这不起作用,因为我不认为你可以嵌套预处理器指令),但我不确定是否可以使用宏。也许有某种模板解决方案?

#ifdef REMOVECODE
#define BEGINTEST #if
#define ENDTEST #endif
#define CONDITION1 defined PROJECT1
#else
#define BEGINTEST if
#define ENDTEST
#define CONDITION1 project == 1
#endif

BEGINTEST(CONDITION1)
{
// some code
}
ENDTEST

如果有人能提供帮助,我将不胜感激。

最佳答案

如果测试中的条件是一个编译时常量,任何半正经的优化编译器都会从目标文件中完全删除无用代码。

所以像这样简单的东西应该可以正常工作:

#ifdef REMOVECODE

#ifdef PROJECT1
#define CONDITION1 1
#else
#define CONDITION1 0
#endif

#else
#define CONDITION1 project == 1
#endif

...

if (CONDITION1)
{
...
}

使用-S(或等价物)运行编译器并查看生成的程序集以确认。

关于c++ - 是否可以根据宏或变量有条件地编译/运行代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6598894/

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