가장 쉬워보이는 방법인
A ## __LINE__
은 (적어도 gcc를 포함한) 여러 컴파일러에서 원하는 대로 작동하지 않는다. 그럼 어떻게 해야 하느냐? 구글링을 해봤다.
http://stackoverflow.com/questions/3580533/c-preprocessor-magic
아직 이렇게 되는 원리를 이해할 수 없다. 아무튼 저걸 성공한 저 분에게 경의를 표한다.
(http://stackoverflow.com/users/15168/jonathan-leffler)
설명을 적어준 분에게도.
(http://stackoverflow.com/users/187690/andreyt)
http://en.wikibooks.org/wiki/C_Programming/Preprocessor
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