这可能是一个风格的问题,但我们的开发团队中存在一些分歧,我想知道是否有其他人对此有任何 idea ...

基本上,我们有一些调试打印语句,在正常开发过程中关闭这些语句.就我个人而言,我更喜欢做以下事情:

//---- SomeSourceFile.cpp ----

#define DEBUG_ENABLED (0)

...

SomeFunction()
{
    int someVariable = 5;

#if(DEBUG_ENABLED)
    printf("Debugging: someVariable == %d", someVariable);
#endif
}

不过,团队中的一些人更喜欢以下内容:

// #define DEBUG_ENABLED

...

SomeFunction()
{
    int someVariable = 5;

#ifdef DEBUG_ENABLED
    printf("Debugging: someVariable == %d", someVariable);
#endif
}

...你觉得哪种方法更好?为什么?我的感觉是,第一个更安全,因为总是有定义的东西,它不会 destruct 其他地方的定义.

推荐答案

我最初的react 是100, of course,但我认为#if实际上在这方面有一些显著的优势-原因如下:

首先,可以在预处理器and编译测试中使用DEBUG_ENABLED.示例——通常,当启用调试时,我想要更长的超时时间,所以使用#if,我可以编写这个

  DoSomethingSlowWithTimeout(DEBUG_ENABLED? 5000 : 1000);

... 而不是

#ifdef DEBUG_MODE
  DoSomethingSlowWithTimeout(5000);
#else
  DoSomethingSlowWithTimeout(1000);
#endif

第二,如果你想从#define迁移到一个全局常数,你就处于一个更好的位置.大多数C++程序员通常不喜欢#defineS.

第三,你说你的团队存在分歧.我猜这意味着不同的成员已经采用了不同的方法,你需要标准化.裁定#if是首选选项意味着使用#ifdef的代码将编译并运行,即使DEBUG_ENABLED为false.跟踪和删除不应该产生的调试输出比反之更容易.

还有一点可读性.你应该能够在#define中使用true/false,而不是0/1,因为这个值是一个单一的词汇标记,所以这是唯一一次你不需要在它周围加括号.

#define DEBUG_ENABLED true

而不是

#define DEBUG_ENABLED (1)

C++相关问答推荐

如何在C中通过转换为char * 来访问float的字节表示?

数组元素的编号索引

如何将匿名VLA分配给指针?

有什么方法可以检测SunOS上的SparcWorks吗?

从STdin读写超过4096个字节

为什么删除CAP_DAC_OVERRIDE后创建文件失败?

当输入负数时,排序算法存在问题

在 struct 中强制转换空指针

实现简单字典时C语言中的段错误

为什么指针运算会产生错误的结果?

一旦运行长度超过2,编译器是否会优化";strnlen(mystring,32)>;2";以停止循环?

#定义SSL_CONNECTION_NO_CONST

将数组插入数组

浮动目标文件,数据段

atoi函数最大长-长误差的再创造

分支预测和UB(未定义的行为)

从系统派生线程调用CRT

无法将字符串文字分配给 C 中的字符数组

memcmp 是否保证按顺序比较字节?

System V 消息队列由于某种原因定期重置