測試項目的代碼里有這樣的宏定義
#define SCRPRINT(fmt,...) fprintf(stderr, "[%s]-> "fmt"\n", __FUNCTION__, ##__VA_ARGS__)
在linux的c或者windows下的c/c++都沒問題,在linux的cpp中編譯無法通過,報了下面的錯誤
error: unable to find string literal operator ‘operator""fmt’ with ‘const char [4]’, ‘long unsigned int’ arguments
查了很久,才發現需要在fmt前面增加一個空格,這是C++11才新增的語法要求,而我們的操作系統和編譯器剛好也升級了,導致以前的代碼不兼容新的編譯器了
修改之后的代碼如下:
#define SCRPRINT(fmt,...) fprintf(stderr, "[%s]-> " fmt"\n", __FUNCTION__, ##__VA_ARGS__)
增加空格之后,無論你的程序保存成.c或者.cpp文件,編譯都是成功的,而且用舊版本的gcc/g++也沒問題。
有的文章里說fmt后面也要增加空格,實際測試下來似乎可有可無。