我正在使用编译器MSVC 2013和GCC尝试下面的代码。
#define AV_FFMPEG_SAMPLE( ... )# __VA_ARGS__
const char *function_store = AV_FFMPEG_SAMPLE(
#define BUF_SIZE 65536
#define ALIGN_MASK 0xFF00
int foo()
{
int abc;
int *xyz;
xyz = (int *)malloc(BUF_SIZE);
return (BUF_SIZE & ALIGN_MASK);
}
);
int main(int argc, char **argv)
{
printf("%s\n", function_store);
}
MSVC 2013输出:
#define BUF_SIZE 65536 #define ALIGN_MASK 0xFF00 int foo(){int abc; int * xyz; xyz =(int *)malloc(BUF_SIZE); return(BUF_SIZE& ALIGN_MASK); }
GCC输出:
int foo(){int abc; int * xyz; xyz =(int *)malloc(BUF_SIZE);返回 (BUF_SIZE& ALIGN_MASK); }
我的首选输出与MSVC 2013输出相同,但我需要使用 GCC(MinGW)来获得相同的结果。如何使用 GCC(MinGW)获得类似 MSVC 2013输出的输出?
答案 0 :(得分:1)
C指定了类似函数的宏调用
如果参数列表中存在预处理标记序列,否则这些标记将作为预处理指令,则行为未定义。
(C 2011 6.10.3 / 11,C99 6.10.3 / 11中相同)。
这正是你的情况。由于字符串化仅适用于类似函数的宏替换列表的上下文,并且对于宏参数包含否则将构成预处理指令的标记的情况(明确地)未定义行为,因此您几乎无论编译器是什么你选。没有可靠的方法来达到你想要的目的。
如果您最想要的是一致的输出,无论哪个编译器构建您的代码,那么将宏定义移出AV_FFMPEG_SAMPLE()
调用的范围。