PRE30-C. 不要通過拼接來構(gòu)造通用字符名
C語言標(biāo)準(zhǔn)支持將不在基本字符集中的字符作為通用字符名蹈胡,用于標(biāo)識符锋叨、字符常量和字符串字面值出刷。通用字符名 \U
nnnnnnnn 指定了8位數(shù)字的短標(biāo)識符 nnnnnnnn适贸。類似的速蕊,通用字符名\u
nnnn 指定了一個4位數(shù)字構(gòu)成的短標(biāo)識符 nnnn 度秘。
C語言標(biāo)準(zhǔn)蒋川,5.1.1.2,第4段 [ISO/IEC 9899:2011], 描述如下:
如果一個滿足通用字符名的字符序列是通過符合拼接構(gòu)建的(6.10.3.3), 行為是未定義的惠险。
參見未定義行為3.
總之苗傅,除非必要盡量避免使用通用字符名。
不遵從規(guī)范的示例代碼
下面的示例代碼不遵從規(guī)范班巩,因?yàn)樗ㄟ^符合拼接構(gòu)建了通用字符名:
#define assign(uc1, uc2, val) uc1##uc2 = val
void func(void) {
int \u0401;
/* ... */
assign(\u04, 01, 4);
/* ... */
}
遵從規(guī)范的方案
這個遵從規(guī)范的方案也使用了通用字符名渣慕,但沒有通過符號拼接來創(chuàng)建:
#define assign(ucn, val) ucn = val
void func(void) {
int \u0401;
/* ... */
assign(\u0401, 4);
/* ... */
}