예를 들어, 나는 최근 리눅스 커널에서 이것을 발견했다.
/ * 조건이 true 인 경우 컴파일 오류를 발생시킵니다 * / #define BUILD_BUG_ON (condition) ((void) sizeof (char [1-2 * !! (condition)]))
따라서 코드에서 8 바이트 크기의 배수와 같은 구조가있는 경우 하드웨어 제약 때문에 아마도 다음을 수행 할 수 있습니다.
BUILD_BUG_ON (((sizeof (struct mystruct) % 8)! = 0);
struct mystruct의 크기가 8의 배수가 아닌 한 컴파일되지 않으며 8의 배수이면 런타임 코드가 전혀 생성되지 않습니다.
내가 아는 또 다른 속임수는 "Graphics Gems"라는 책에서 한 헤더 파일이 한 모듈에서 변수를 선언하고 초기화하는 동안 해당 모듈을 사용하는 다른 모듈에서는 externs로 선언하는 것입니다.
#ifdef DEFINE_MYHEADER_GLOBALS #define GLOBAL INIT (x, y) 정의 (x) = (y) #그밖에 #define GLOBAL extern INIT 정의 (x, y) #endif GLOBAL int INIT (x, 0); GLOBAL int somefunc (int a, int b);
이를 통해 x와 somefunc를 정의하는 코드는 다음을 수행합니다.
#DEFINE_MYHEADER_GLOBALS 정의 #include "the_above_header_file.h"
x와 somefunc ()를 사용하는 코드는 다음과 같습니다.
#include "the_above_header_file.h"
따라서 필요한 전역 및 함수 프로토 타입 인스턴스와 해당 extern 선언을 모두 선언하는 하나의 헤더 파일을 얻습니다.
그렇다면 그 라인에서 가장 좋아하는 C 프로그래밍 트릭은 무엇입니까?
BUILD_BUG_ON
사용하여 매크로, what's 잘못된 #error
내부를 #if
?