關於gcc 5 5 0關於巨集展開的BUG

2021-10-25 13:05:50 字數 2170 閱讀 8498

gcc版本:5.5.0

vs版本:vs 2015

如下巨集定義**

#define logdebug(format, ...) fprintf(stdout, "debug file:%s, line:%d, msg: " format"\n", __file__, __line__, ##__va_args__)

//#define logdebug(format, args...) fprintf(stdout, "debug file:%s, line:%d, msg: " format"\n", __file__, __line__, ##args)

#define loginfo(format, args...) fprintf(stdout, "info file:%s, line:%d, msg: " format"\n", __file__, __line__, ##args)

#define logwarn(format, args...) fprintf(stderr, "warn file:%s, line:%d, msg: " format"\n", __file__, __line__, ##args)

#define logerror(format, args...) fprintf(stderr, "error file:%s, line:%d, msg: " format"\n", __file__, __line__, ##args)

#define logfatal(format, args...) fprintf(stderr, "fatal file:%s, line:%d, msg: " format"\n", __file__, __line__, ##args)

vs和gcc都可以編譯通過的。

而如下**gcc是無法編譯通過的,vs是能正常編譯通過的。(與上份**的區別,只是format前面少了乙個空隔)

#define logdebug(format, ...) fprintf(stdout, "debug file:%s, line:%d, msg: "format"\n", __file__, __line__, ##__va_args__)

//#define logdebug(format, args...) fprintf(stdout, "debug file:%s, line:%d, msg: " format"\n", __file__, __line__, ##args)

#define loginfo(format, args...) fprintf(stdout, "info file:%s, line:%d, msg: "format"\n", __file__, __line__, ##args)

#define logwarn(format, args...) fprintf(stderr, "warn file:%s, line:%d, msg: "format"\n", __file__, __line__, ##args)

#define logerror(format, args...) fprintf(stderr, "error file:%s, line:%d, msg: "format"\n", __file__, __line__, ##args)

#define logfatal(format, args...) fprintf(stderr, "fatal file:%s, line:%d, msg: "format"\n", __file__, __line__, ##args)

按照正常的巨集定義的理解,format前面有無空隔均可以編譯通過的。見如下**:

logdebug("helllo world.%d", 1);

//compile okay

fprintf(stdout, "debug file:%s, line:%d, msg: ""helllo world.%d""\n", __file__, __line__, 1);

//compile okay

fprintf(stdout, "debug file:%s, line:%d, msg: " "helllo world.%d""\n", __file__, __line__, 1);

另外,gcc 6.5.0版本是能夠正常編譯通過。所以我認為這是gcc 5.5.0的bug,coder們遇到此問題無需糾結,解決方法就是在變數名前加乙個空隔,原因可能把空隔當成了分隔符來處理了。

關於gcc擴充套件中的巨集定義中用 和

關於gcc擴充套件中的巨集定義中用 和 今天測試了巨集定義中的 和 的區別。結果如下 代表和乙個字串相連線 代表和乙個符號連線,符號可以是變數,或另乙個巨集符號。舉例如下 巨集定義如下 1 define dev file name dev test kft define open file fd,n...

關於gcc擴充套件中的巨集定義中用 和

關於gcc擴充套件中的巨集定義中用 和 今天測試了巨集定義中的 和 的區別。結果如下 代表和乙個字串相連線 代表和乙個符號連線,符號可以是變數,或另乙個巨集符號。舉例如下 巨集定義如下 1 define dev file name dev test kft define open file fd,n...

關於巨集的 與

c c 巨集中 和 的用法 zz 巨集中 和 的用法 一 一般用法 我們使用 把巨集引數變為乙個字串,用 把兩個巨集引數貼合在一起.用法 include includeusing namespace std define str s s define cons a,b int a e b int m...