我想启用" printf("宏MESSAGE是%d \ n",MESSAGE);"在运行时间。例如,如果我在运行时给出参数10,它应该打印消息。如果没有给出,则不应打印此消息。是否可能?
#include <stdio.h>
#define MESSAGE 10
int foo;
void main(int argc, char *argv[])
{
foo = atoi(argv[1]);
printf("foo is %d\n", foo);
#if MESSAGE==foo
printf("macro MESSAGE is %d\n",MESSAGE);
#endif
}
答案 0 :(得分:3)
我们可以根据预处理器宏有条件地定义宏来控制编译时宏的定义是什么:
#if DEBUGGING
#define debug(format, ...) fprintf(stderr, format, __VA_ARGS__)
#else
#define debug(format, ...) ()
#endif
debug
宏本身就是GCC's manual中的一个示例。
或者,我们可以创建一个类似的函数来检查运行时某个变量的值:
#include <stdarg.h>
#include <stdio.h>
int debugging = 10;
void debug(int msglevel, const char *fmt, ...)
{
if (debugging < msglevel) return;
va_list va;
va_start(va, fmt);
vfprintf(stderr, fmt, va);
va_end(va);
}
...
debug(10, "Error: %s\n", "some explanation");
完整的功能可以比详细程度更容易进行比较。当然,我们仍然可以在编译时对函数进行替代定义以完全禁用它。对于varargs,请参阅va_arg(3) man page。