是否可以接受所有".h"文件导入"macros.h"使用预处理指令设置详细程度



正如标题中所描述的,问题是通过生成all"来设置代码的详细程度是否被认为是一种好的做法;。h〃;文件导入单个";。h〃;定义预处理指令的文件?例如

宏.h包含

#ifndef VERBOSE
#define VERBOSE true
#endif

则函数1.h可以是

#include "../macros/macros.h"
void eatBurguers(int i){
if (VERBOSE) {
printf("Today I ate %d burguers, yum!", i);
}
}

函数2.h可以是

#include "../macros/macros.h"
#include <vector>
void preallocateVector(std::vector<int> &v){
if (VERBOSE) {
printf("About to resize a vector");
}   
v.resize(100);
if (VERBOSE) {
printf("A vector has just been resized");
}   
}

除了节省我们在每个"处添加宏所需的时间之外;。h〃;文件,我突然想到它可以不那么凌乱。

编辑:事实上,答案和评论解决了答案如何取决于每个项目的具体情况,我理解这在某种程度上意味着前面描述的实践中没有本质上的错误。

更多信息:目前的用例是一个科学计算应用程序,它在编译前一步移动了详细度的定义,以便允许一些"智能编译器"删除if,因此不需要生成允许详细输出的最终应用程序,并且在每次打印中显式检查定义被认为会降低可读性。

编辑2:在克里斯的回答之后,确实有一个"更好"的方法。

使用if#if defined丢弃代码是疯狂的,会使代码库难以读取和使用。

如果你要用一个通用的头来定义宏,那么就让宏的扩展成为你真正想要的(而不是让它们只是一个必须检查的条件。(我不太喜欢代码中的宏,但如果你要这样做,至少要把所有的条件代码放在一个地方。

也就是说,如果你有宏。h,做这样的事情:

#if defined(VERBOSE)
#define PRINTF_DBG printf
#else
#define PRINTF_DBG(...) 
#endif

然后,在使用它的文件中,只需调用PRINTF_DBG,而不进行任何测试,它就会扩展到printf(<args>),或者只是消失

void preallocateVector(std::vector<int> &v){
PRINTF_DBG("About to resize a vector");
v.resize(100);
PRINTF_DBG("A vector has just been resized");
}

代码更干净,噪音更小。

比较定义了VERBOSE和未定义VERBOSE的预处理器的结果:https://godbolt.org/z/hG33MYvr3

我认为在条件为唯一预处理器宏的情况下使用if是一种糟糕的做法。

当您使用预处理器宏来决定是否需要详细输出时,我宁愿使用这样的条件编译:

void preallocateVector(std::vector<int> &v){
#if VERBOSE == 1
printf("About to resize a vector");
#endif
v.resize(100);
#if VERBOSE == 1
printf("A vector has just been resized");
#endif
}

另一方面,如果你想在运行时打开/关闭冗长,并且只在这种情况下,那么你可能想要这样的东西:

...
bool verbose_mode;
// set verbose_mode to true or false depending on whatever condition during runtime
void preallocateVector(std::vector<int> &v){
if (verbose_mode) {
printf("About to resize a vector");
}   
v.resize(100);
if (verbose_mode) {
printf("A vector has just been resized");
}   
}

最新更新