c++ - static_assert와 sizeof 및 stringify를 결합하는 방법은 무엇입니까?



visual-studio-2010 c++11 (2)

검사를 수행하기 위해 함수 템플릿에 디스패치를 ​​사용합니다.

#include <cstddef>

template <typename ToCheck, std::size_t ExpectedSize, std::size_t RealSize = sizeof(ToCheck)>
void check_size() {
  static_assert(ExpectedSize == RealSize, "Size is off!");
}

struct foo
{
  char bla[16];
};

int main()
{
  check_size<foo, 8>();
  return 0;
}

결과 :

In instantiation of void check_size() [with ToCheck = foo; long unsigned int ExpectedSize = 8ul; long unsigned int RealSize = 16ul]’:
bla.cpp:15:22:   required from here
bla.cpp:5:1: error: static assertion failed: Size is off!

디버깅 정보는 백 트레이스의 템플릿 매개 변수에 있습니다.

이것이 정말 좋은 것이라면, 당신은 결정해야 할 것이고 그것은 또한 컴파일러에 달려 있습니다. 또한 최대 크기 및 기타 멋진 것들을 요약하기 위해 예상되는 크기를 템플릿 맵으로 숨길 수 있습니다.

메모리 사용은 응용 프로그램에서 매우 중요합니다. 따라서 컴파일 타임에 메모리 크기를 확인하고 크기가 이전과 다른 경우 static_assert를 제공하는 특정 assert를 사용합니다.

나는 다음과 같은 매크로를 정의했다 :

#define CHECKMEM(mytype, size) static_assert((sizeof(objectType) == size)), "Size incorrect for " #mytype "!");

이 매크로는 다음과 같이 작성하기가 쉽습니다.

CHECKMEM(Book,144);
CHECKMEM(Library,80);

문제는이 static_assert가 해제되면 새로운 크기 (예 : 숨겨진 컴파일러 옵션 "/ d1 reportAllClassLayout"사용)를 알아내는 것이 어려울 수 있다는 것입니다. 실제 크기를 포함 할 수 있다면 훨씬 더 편리 할 것입니다.

책의 크기가 잘못되었습니다!

그것은

책의 크기가 잘못되었습니다! (예상 144, 크기는 152)

나는 이런 식으로 글을 써 보았다.

#define CHECKMEM(mytype, size) static_assert((sizeof(objectType) == size)), "Size incorrect for " #mytype "! (expected" #size ", size is " #sizeof(mytype) ")");

그러나 함수 호출에서는 stringize (#) 연산자를 사용할 수 없습니다.

나 또한 double-stringize 트릭을 추가하려고 시도했다.

#define STR1(x) #x 
#define STR2(x) STR1(x) 
#define CHECKMEM(mytype, size) static_assert((sizeof(objectType) == size)), "Size incorrect for " #mytype "! (expected" #size ", size is " STR2(sizeof(mytype)) ")");

하지만 인쇄 size is 152 대신 size is sizeof(Book) 입니다.

static_assert에서 sizeof의 결과를 문자열로 나타낼 수있는 방법이 있습니까?


발견 한대로 문제는 여기에 있습니다 ( 이와 비슷한 질문을 참조하십시오).

#define CHECKMEM(mytype, size)  #sizeof(mytype)

문자열 처리는 전처리기에 의해 수행되고 컴파일 중 sizeof가 계산되므로 수행 할 수 없습니다.





static-assert