Linux中有個stringify的標頭檔,裡面主要的內容如下:
#ifndef __LINUX_STRINGIFY_H#define __LINUX_STRINGIFY_H/* Indirect stringification. Doing two levels allows the parameter to be a * macro itself. For example, compile with -DFOO=bar, __stringify(FOO) * converts to "bar". */#define __stringify_1(x...)#x#define __stringify(x...)__stringify_1(x)#endif/* !__LINUX_STRINGIFY_H */
裡面有兩個define,依照注釋看的不太明白。為什麼中間要通過__stringify_1轉換一下呢。直接使用#define __stringify(x...) #x豈不是更加簡潔。
編程測試一下:
#include <stdio.h>#define AAA BBB#define __stringify_1(x...) #x#define __stringify(x...) __stringify_1(x)#define __stringify_src(x...) #xmain(){printf("stringify(AAA): %s\n", __stringify(AAA));printf("stringify_src(AAA): %s\n",__stringify_src(AAA));}
啟動並執行結果如下:
stringify(AAA): BBB
stringify_src(AAA): AAA
然後回過頭來看注釋,就一清二楚了。
不過注釋裡有這一句“Doing two levels allows the parameter to be a macro itself.”
該怎麼理解呢。
如果在#define AAA BBB之前再定義一個#define BBB CCC,#define CCC DDD ......,這個程式啟動並執行結果如何呢。
呵呵,大家可以嘗試一下。