2009-06-29 3 views
4

Если я объявляю константу сказатьC Константа

«#define МЕСЯЦА = 12» в C Я знаю, что директива препроцессора заменит везде, где используются МЕСЯЦЫ, но хочет знать, если память выделяются магазин 12 ??, если да, то какой будет ярлык и какой будет тип данных.

ответ

20

Вы, скорее всего, хотите, чтобы ваши определения как такового:

 
#define MONTHS 12 

/* some code here... */ 

int payAnnual = payMonthly * MONTHS; 

Чтобы ответить на ваш вопрос, не будет использоваться никакой памяти. Препроцессор не знает о таких понятиях, как переменные и память. Это, по сути, автоматизированный текстовый редактор. Он заменит любое появление символа MONTHS на 12.

Поскольку предварительный процессор настолько тупой, обычно предпочтительнее использовать константную переменную. Это дает вам преимущество проверки типов и облегчает чтение ошибок компилятора. И пока вы объявляете его статическим, переменная будет оптимизирована. (Если вы не объявить глобальную переменную статического в C, по умолчанию, он будет экспортироваться, поэтому компилятор не может оптимизировать его прочь полностью.)

 
static const int MONTHS = 12; 
+0

Если вы говорите о C++, константы имеют локальную связь и, таким образом, не «экспортируются». – 2009-06-29 11:19:26

+0

Это просто заставляет меня думать, что C++ объявляет константу static const int MONTHS = 12 будет выделять размер памяти и будет иметь 12 сохраненных в ней прав? В конце дня константа постоянна и каково было бы преимущество в C++, объявляющее const таким образом, где выделяется память. Просто интересно! – Lakshmi

+2

Компилятор C++ может (и будет) выбирать, чтобы оптимизировать конфигурацию const, если вы не делаете что-то вроде своего адреса. Но если вы хотите спросить о C++, вам будет лучше начать новый вопрос - C и C++ - это разные языки. – 2009-06-29 11:21:27

9

Синтаксис на самом деле:

#define MONTHS 12 

Нет знака = допускается. И в компилируемом коде для MONTHS не выделяется память, и у нее нет типа данных.

+4

Ну, я думаю, что это допустимо, но он не будет делать то, что он намеревается сделать с этим :-). – Joey

+0

С знаком =, gcc по крайней мере выдает предупреждение. – 2009-06-29 11:14:53

+1

@Neil, обратите внимание на пространство после MONTHS в его вопросе. –

3

Память для символов препроцессора не выделяется отдельно. Если вы когда-либо используете его как значение где-то, это может вызвать соответствующее распределение.

Например:

char something[1024*MONTHS];// 1024*12 bytes 

иначе константа никогда не переживет время компиляции. И он не имеет типа данных.

3

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

3

Весь смысл предварительного процессора C заключается в том, что он заменяет его перед компиляцией кода. поэтому # -пределенные константы не сохраняются в той точке, в которой они определены, только когда они используются.

+0

Я думал, что все дело в том, чтобы сделать максимально компилируемую программу больше, разделив компиляцию на несколько этапов. –

+0

@marco Это не имеет ничего общего с предварительным процессором. Языки, такие как Delphi, у которых нет препроцессора, поддерживают отдельную компиляцию. – 2009-06-29 11:52:48

+0

Наличие препроцессора по-прежнему увеличивает максимальный размер единицы компиляции, имея меньше символов в главном компиляторе. И связывание может быть сделано поэтапно, чтобы сохранить память. Здесь вы найдете очень ранние системы Unix (PDP-7 и 11 и т. Д.). –

2

Они используются так же, как фактическое число, и обычный тип литерала для целого числа используется в вычислениях, где в программе отображается имя макроса.

Подобно тому, как если бы вы были объявить

#define FOO "bar" 

Тогда вхождения обув будут заменены с типичным использованием «бар», являющимся указатель на некоторое местоположение строки постоянная в объектном файле программы отображается в Память.

На самом деле нет разницы.

6

Препроцессор просто вносит символические изменения в исходный код. Следовательно, код будет вести себя так же, как если бы вы просто заменили все вхождения MONTHS на себя. И, следовательно, влияние использования памяти на память отсутствует.

Использование предварительных определений компилятора - отличный способ повысить уровень абстракции вашего кода без памяти воздействия производительности.

С уважением

0

Нет,

weeks = 12 * 4; 

точно так же, как:

weeks = MONTHS * 4; 

ли взять память? Нет, поэтому ни МЕСЯЦЫ.

0

если 12 выделяется зависит от использования и не имеет ничего общего с препроцессором на всех

Somefunction(MONTH); 

будет расширяться

Somefunction(12); 

12 здесь должны OFC храниться где-то в этой, он будет сохранен в исполняемом файле. Тип, вероятно, будет зависеть от того, что Somefunction принимает в качестве аргумента (или того, что решает компилятор, подходит для этого использования). Нет метки для знака «12».

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

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