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가지 경우를 내보낼 있다.

  1. ## 먼저 연산할 경우 : HelloWorld
  1. # 먼저 연산할 경우 : *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

+ Recent posts