C预处理器字符串化命令行和代码定义中的差异



项目有能力编译中的代码,并且需要知道哪些代码包含在内,哪些不包含在内。这些函数都被隔离在单个文件中,并且其中的代码被包含在CCD_ 1中;魔术;

#define STRINGIZE(x)  __STRINGIZE(x)
#define __STRINGIZE(x) ""#x""
#define MP_HAS(x)        (sizeof(STRINGIZE(x##_C)) == 1u )

如果定义了有问题的宏,它会扩展为一个大小为1的空字符串(只计算),如果没有,则会扩展给定的整个字符串,解析为值>1

可以玩的东西:

#include <stdlib.h>
#include <stdio.h>
#ifdef DEFINE_IT
#define FOOT_C
#endif
#define STRINGIZE(x)  __STRINGIZE(x)
#define __STRINGIZE(x) ""#x""
#define HAVE_WE(x)        (sizeof(STRINGIZE(x##_C)) )
int main(void) {
printf("sizeof(stringized) = %zun", HAVE_WE(FOOT));
exit(EXIT_SUCCESS);
}

到目前为止,一切都很好。有点复杂,但它有效。

但是:如果我们在命令行给出定义(测试所有分支)gcc -DFOOT_C sizeoftest.c -o sizeoftest,宏将扩展到1,因此字符串不再为空,并且具有2(两)的sizeof,字符1和字符

一种解决方法是将命令行中给出的定义明确地设置为空字符串:gcc -DFOOT_C="" sizeoftest.c -o sizeoftest

有没有一种方法可以调整字符串宏来忽略这种差异,并以相同的方式处理定义宏的两种方法?

编辑:遗憾的是,如果定义了宏,在运行时检查中提出的答案并不完全合适,但它很接近。可能是正确的方向。

有没有一种方法可以调整字符串宏来忽略这种差异,并以相同的方式处理两种方式来定义宏?

否。这是pre-处理器,您可以静态地键入它。

#ifdef FOOT_C
#define HAVE_FOOT_C  1
#else
#define HAVE_FOOT_C  0
#endif

那么你通常只有#ifdef UPPERCASE_FILENAME_C ...code... #endif0。

相关内容

  • 没有找到相关文章

最新更新