可以“#ifdef DEBUG(...)__ VA_ARGS__”吗?

时间:2013-03-29 00:46:38

标签: c++ macros

Global.h

#ifndef GLOBAL_H
#   define GLOBAL_H

#define DEBUG

#ifdef DEBUG
#   define IF_DEBUG( ... )   __VA_ARGS__
#else
#   define IF_DEBUG( ... )
#endif /* DEBUG */

#endif /* GLOBAL_H */

Main.cpp的

#include <string>
#include <iostream>
#include "Global.h"

int main() {
    int A = 1;
    int B = 2;
    int C = 0;

    IF_DEBUG(
        std::cout << "\nStep 1> Calculating...\n";
    )

    C = A + B;

    // DO WHATEVER

    IF_DEBUG(
        std::cout << "\nStep n> ...\n";
    )

    // ...

    std::cout << C << std::endl;

    // Note: I could also do some operations within the IF_DEBUG macro.
    IF_DEBUG(
        int X = 10;
        int Y = 5;
        int Z = X / Y;
        std::cout << Z << std::endl;
    )

    IF_DEBUG(
        std::cout << "\nDebugged! This program has been paused. Enter any key to continue!\n";
        ::getchar();
    )
    return 0;
}

您是否看到我如何在全局头文件(Global.h)中定义IF_DEBUG以及我如何经常使用 它在主源文件(Main.cpp)中用于调试目的? 这样做是否安全可靠?

我问这个问题,因为我不确定是否可以这样做。当我向朋友展示这个时,他说这样做“不好”。因此,我不确定。

1 个答案:

答案 0 :(得分:3)

这是一个非常常见且有用的技巧。但最好不要在源代码中使用#define DEBUG。您可以在编译命令行中定义它。 g++ -DDEBUG -c file.cpp将编译代码,就像定义了DEBUG一样。

如果您使用Makefile,可以将其添加到CPPFLAGS(C预处理程序标志)变量:CPPFLAGS=-DDEBUG

如果您正在使用IDE,请尝试在项目设置中找到C预处理器标志。