Как я могу использовать "sizeof" в макросе препроцессора? - PullRequest
81 голосов
/ 02 ноября 2010

Есть ли способ использовать sizeof в макросе препроцессора?

Например, за эти годы было множество ситуаций, в которых я хотел сделать что-то вроде:

#if sizeof(someThing) != PAGE_SIZE
#error Data structure doesn't match page size
#endif

Точная вещь, которую я проверяю здесь, полностью составлена ​​- суть в том, что мне часто нравится вставлять эти типы (размер или выравнивание) проверок во время компиляции, чтобы защититься от того, кто-то изменяет структуру данныхможет привести к неправильному выравниванию или изменению размера вещей, которые могут их сломать.

Само собой разумеется, я не могу использовать sizeof, как описано выше.

Ответы [ 11 ]

0 голосов
/ 30 июня 2013

Оператор sizeof недоступен для препроцессора, но вы можете передать sizeof компилятору и проверить условие во время выполнения:

#define elem_t double

#define compiler_size(x) sizeof(x)

elem_t n;
if (compiler_size(elem_t) == sizeof(int)) {
    printf("%d",(int)n);
} else {
    printf("%lf",(double)n);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...