2010-09-13 3 views

ответ

7

Макрос принимает аргументы и (обычно) генерирует фактический код, A помощью #define: д константа является лишь значение:

Например :

#define MAX_NAME_LENGTH 32 

против

#define MAX(a, b) ((a) > (b) ? (a) : (b)) 

конечно, это часто лучше использовать фактические константы языка на уровне, когда это возможно:

enum { 
MAX_NAME_LENGTH = 32 
} 

или

const size_t MAX_NAME_LENGTH = 32; 

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

+0

Но помните, что 'const' не делает что-то постоянное время компиляции. Например, вы не можете использовать его для объявления размера статически выделенного массива. – detly

+1

@detly: right, in C. В C++ вы действительно можете –

+1

'MAX_NAME_LENGTH' также является макросом. (Это не макрос * function-like *.) Я думаю, что лучшим описанием было бы то, что макросы эффективно выполняют только текстовую замену. – jamesdlin

0

Константы в C (вы просили об этом) - это числовые константы (0, 1, 0x0, 0,1, 1.E-10, ...), константы интегральных символов ('a', '\ n', L 'A', ...) и констант перечисления (типа int!). Таким образом, более поздние версии являются единственными, которые могут быть определены программой.

Переменные, которые квалифицируются с атрибутом const не являются константами в смысле С. (лучше читать const здесь unmutable или invariant)

Макросы просто текстовые замены, которые сделаны на этапе предварительной обработки. Часто стандартные заголовки библиотек содержат макросы, которые расширяются до подходящей константы для соответствующей системы. Таково например NULL, false, true, INT_MAX, CHAR_BIT ...

Смежные вопросы