宏定义中的 # 和 ## 运算符不应嵌套使用
3.2.7 ID_macro_complexConcat
# 和 ## 运算符的求值顺序在标准中是未声明的,不应嵌套使用。
示例:
#define M0(a, b) #a ## b // Non-compliant
#define M1(a, b, c) a ## b ## c // Non-compliant
#define M2(a) #a // Compliant
#define M3(a, b) M2(a ## b) // Compliant
依据
ISO/IEC 9899:1999 6.10.3.2(2)-unspecified
ISO/IEC 9899:1999 6.10.3.3(3)-unspecified
ISO/IEC 9899:2011 6.10.3.2(2)-unspecified
ISO/IEC 9899:2011 6.10.3.3(3)-unspecified
ISO/IEC 14882:2003 16.3.2(2)-unspecified
ISO/IEC 14882:2003 16.3.3(3)-unspecified
ISO/IEC 14882:2011 16.3.2(2)-unspecified
ISO/IEC 14882:2011 16.3.3(3)-unspecified
ISO/IEC 14882:2017 19.3.2(2)-unspecified
ISO/IEC 14882:2017 19.3.3(3)-unspecified
参考
MISRA C 2004 19.12
MISRA C 2012 20.11
MISRA C++ 2008 16-3-1