Условная компиляция и оценка времени компиляции выражений в ANSI C - PullRequest
1 голос
/ 26 июля 2011

Я хотел бы сделать следующее, но компилятору это не нравится:

unsigned short foo = 1;
// do something with foo
#if sizeof(short) * CHAR_BIT > 16
   foo &= 0xffff;
#endif

Я знаю, что это выражение всегда можно полностью оценить во время компиляции, но, возможно, оно вычисляется только после препроцессораэто вещь?Возможно ли это в ANSI C или мне просто нужно выполнить проверку во время выполнения?

Ответы [ 2 ]

5 голосов
/ 26 июля 2011

Если ваша цель - остановить компиляцию, если тип данных имеет неправильный размер, будет полезен следующий метод:

struct _check_type_sizes
{
  int int_is_4_bytes[(sizeof(int) == 4) ? 1 : -1];
  int short_is_2_bytes[(sizeof(short) == 2) ? 1 : -1];
};

(Функция sizeof () интерпретируется здесь компилятором, а не препроцессором.)

Основным недостатком этого метода является то, что ошибка компилятора не очень очевидна. Убедитесь, что вы написали очень четкий комментарий.

5 голосов
/ 26 июля 2011

Вы не можете использовать sizeof в выражении препроцессора. Возможно, вы захотите сделать что-то вроде этого:

#include <limits.h>

#if SHRT_MAX > 32767
    /* do soemthing */
#endif
...