Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:宏中的预处理器?_C_Macros_C Preprocessor - Fatal编程技术网

C:宏中的预处理器?

C:宏中的预处理器?,c,macros,c-preprocessor,C,Macros,C Preprocessor,有没有办法在宏中使用预处理器关键字?如果有某种逃逸的性质或东西,我不知道 例如,我想制作一个扩展到以下内容的宏: #ifdef DEBUG printf("FOO%s","BAR"); #else log("FOO%s","BAR"); #endif 由此: PRINT("FOO%s","BAR"); 这是可能的,还是我疯了(每次我想显示调试消息时,我都必须键入预处理器条件)?您不能直接这样做,不可以,但是您可以根据是否定义了debug来定义PRINT宏: #ifdef DE

有没有办法在宏中使用预处理器关键字?如果有某种逃逸的性质或东西,我不知道

例如,我想制作一个扩展到以下内容的宏:

#ifdef DEBUG
    printf("FOO%s","BAR");
#else
    log("FOO%s","BAR");
#endif
由此:

PRINT("FOO%s","BAR");

这是可能的,还是我疯了(每次我想显示调试消息时,我都必须键入预处理器条件)?

您不能直接这样做,不可以,但是您可以根据是否定义了
debug
来定义
PRINT
宏:

#ifdef DEBUG
    #define PRINT(...) printf(__VA_ARGS__)
#else 
    #define PRINT(...) log(__VA_ARGS__)
#endif

换一种方式:

#ifdef DEBUG
    #define PRINT printf
#else
    #define PRINT log
#endif

你不是疯了,但你从错误的角度来看待这件事。不能让宏展开以具有更多预处理器参数,但可以基于预处理器参数有条件地定义宏:

#ifdef DEBUG
# define DEBUG_PRINT printf
#else
# define DEBUG_PRINT log
#endif

如果你有可变宏,你可以做
#define DEBUG_PRINTF(…)func(u VA_ARGS)
。两种方法都有效。第二种方法允许您使用函数指针,但我无法想象您为什么需要它。我知道这一定是有可能的,但我只是看错了方向。谢谢。@James McNellis:这将创建一个错误,
PRINT(“FOO%s”,“BAR”)扩展到
日志(“FOO%s”,“BAR”)。@equality:C89/90没有可变宏,没有。@nightcracker-虽然很难看,但这绝不是一个错误。@nightcracker:我已经注意到了这一点,并删除了无关的