'static assert'에 해당되는 글 1건

  1. 2011.04.14 C/C++에서 ##로 __LINE__을 붙이기
  2. .
프로그래밍/C/C++2011. 4. 14. 23:38
가장 쉬워보이는 방법인
A ## __LINE__
은 (적어도 gcc를 포함한) 여러 컴파일러에서 원하는 대로 작동하지 않는다. 그럼 어떻게 해야 하느냐? 구글링을 해봤다.

http://stackoverflow.com/questions/3580533/c-preprocessor-magic

아직 이렇게 되는 원리를 이해할 수 없다. 아무튼 저걸 성공한 저 분에게 경의를 표한다.
(http://stackoverflow.com/users/15168/jonathan-leffler)
설명을 적어준 분에게도.
(http://stackoverflow.com/users/187690/andreyt)
#define DECLARE(x) _DECLARED_VARIABLE_ ## x ## _LINE_ ## __LINE__

#define DECLARE11(x, line) _DECLARED_VARIABLE_ ## x ## _LINE_ ## line
#define DECLARE10(x) DECLARE11(x, __LINE__)

#define DECLARE23(line) _LINE_ ## line
#define DECLARE22(x) _DECLARED_VARIABLE_ ## x
#define DECLARE21(x, line) DECLARE22(x) ## DECLARE23(line)
#define DECLARE20(x) DECLARE21(x, __LINE__)

#define DECLARE32(line) _LINE_ ## line
#define DECLARE31(x, line) _DECLARED_VARIABLE_ ## x ## DECLARE32(line)
#define DECLARE30(x) DECLARE31(x, __LINE__)

#define DECLARE42(x, line) _DECLARED_VARIABLE_ ## x ## _LINE_ ## line
#define DECLARE41(x, line) DECLARE42(x, line)
#define DECLARE40(x) DECLARE41(x, __LINE__)

int DECLARE(y);
int DECLARE10(z) = 12;
int DECLARE20(a) = 37;
int DECLARE30(b) = 91;
int DECLARE40(c) = 129;
이 많은 코드 중 (아마도) DECLARE40만 원하는 대로 동작할 것이다. (컴파일러에 따라 다를 수도 있다.) 컴파일이 안 되는 DECLARE20과 DECLARE30을 제외하고 나머지의 결과는 다음과 같다.
int _DECLARED_VARIABLE_y_LINE___LINE__;
int _DECLARED_VARIABLE_z_LINE___LINE__ = 12;
int _DECLARED_VARIABLE_c_LINE_23 = 129;
결론적으로 다음과 같이 사용하면 된다. Static assert의 경우 크기가 음수인 배열을 typedef로 선언하면서 컴파일 에러를 발생시키는 방식이다. 이건 (http://stackoverflow.com/questions/1597704/verifying-that-c-c-signed-right-shift-is-arithmetic-for-a-particular-compiler)에서 본 것.
#define LINE2(x, line) x ## line
#define LINE1(x, line) LINE2(x, line)
#define LINE(x) LINE1(x, __LINE__)
#define MY_STATIC_ASSERT2(x, line) \
        typedef int MyStaticAssert_line_ ## line[(x) ? 1 : -1]
#define MY_STATIC_ASSERT1(x, line) MY_STATIC_ASSERT2(x, line)
#define MY_STATIC_ASSERT(x) MY_STATIC_ASSERT1(x, __LINE__)
그 외에 참고할 만한 곳
http://en.wikibooks.org/wiki/C_Programming/Preprocessor
Posted by asdfzxcv