MISRA 에 보면 #, ## 을 한 매크로에서 2번쓰지 말라는 규칙이 있다. 왜 그런지 궁금해서 찾아봤다.
Rule 의 요구사항과 Justification 영문은 이렇다.
There shall be at most one occurrence of the # or ## operators in a single macro definition
Because the evaluation order of # and ## are not specified, the results of using them both in the same macro could be unpredictable. Therefore macros should contain at most once instance of either # or ##.
해석해보니
"# 및 ## 의 연산 순서가 지정되어 있지 않기 때문에 동일한 매크로에서 둘다 사용하는 경우에 결과를 정확히 예측할 수 없기 때문에 # 또는 ##을 한번만 포함해야 한다 " 는 뜻이다.
[ 오류가 예상되는 예시 ]
#define NonCompliant(a, b) # a ## b
int main() {
std::cout << NonCompliant(Hello, World);
}
이 코드에서 컴파일러가 2가지 경우를 내보낼 수 있다.
- ##을 먼저 연산할 경우 : HelloWorld
- #을 먼저 연산할 경우 : *Hello "World *
이 나올 수 있다.
[ 규칙을 잘 지킨 예시 ]
#define Stringfy(a) #a
#define Compliant(a, b) Stringfy(a##b)
int main(){
std::cout << Compliant(Hello, World);
}
이 경우에 정확히 HelloWorld 가 프린트 된다
[ Reference ]
MISRA C 2012, Rule 20.11
MISRA C 2004, Rule 19.12