Что означают эти странные макроопределения (и являются ли они даже правильными?) - PullRequest
3 голосов
/ 08 января 2012

Я работаю над некоторым устаревшим кодом C и натолкнулся на два странных определения макросов.Они выглядят неправильно, а также отвечают за некоторые предупреждения компилятора ( предупреждение: левый операнд выражения запятой не действует ), что заняло у меня несколько часов, чтобы наконец отследить эти макросы.

Может кто-нибудь сказать мне, если они правильные (я подозреваю, нет), и если нет, как я могу их исправить?

#define MAX_MEMORY_BLOCK (sizeof(size_t)==2,65535,2147483647)
#define MAX_ARRAY_SIZE   (sizeof(size_t)==2,16384,1073741824)

Ответы [ 2 ]

5 голосов
/ 08 января 2012

Они содержат запятые операторы;«учитывается» только последнее значение, поэтому они эквивалентны:

#define MAX_MEMORY_BLOCK (2147483647)
#define MAX_ARRAY_SIZE   (1073741824)

В качестве альтернативы кто-то забыл, что троичный оператор использует ?::

#define MAX_MEMORY_BLOCK (sizeof(size_t)==2 ? 65535 : 2147483647)
#define MAX_ARRAY_SIZE   (sizeof(size_t)==2 ? 16384 : 1073741824)

Однако их малосовременные системы, в которых sizeof(size_t) == 2 (хотя, возможно, они есть, особенно в мире встраиваемых компьютеров).

2 голосов
/ 08 января 2012

Что это действительно делает, это:

1, 65535, 2147483647
1, 16384, 1073741824

или

0, 65535, 2147483647
0, 16384, 1073741824

в современных компиляторах.

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

Если вы хотите избавиться от предупреждений, вы, вероятно, можете изменить их на:

#define MAX_MEMORY_BLOCK 2147483647
#define MAX_ARRAY_SIZE   1073741824

Я не уверен, что эти значения действительно имеют смысл.

...