Здравствуйте, NoFate, Вы писали:
NF>Здравствуйте, Аноним, Вы писали:
А>>Подскажите,чайнику,что означает #pragma once ? А>>Спасибо.
NF>Запрет дополнительных включений. Microsoft Specific.
Здравствуйте, Аноним, Вы писали:
А>Подскажите,чайнику,что означает #pragma once ? А>Спасибо.
MS specified форма следующего
#ifndef INCLUDE_H
#define INCLUDE_H
#endif
то есть говорить о том, что файл включается в единицу трансляции только один раз.
плюс в том, что обработка идет не на уровне дефайнов, и файл второй раз даже не подгружается
Здравствуйте, Аноним, Вы писали:
А>Подскажите,чайнику,что означает #pragma once ?
Что за компилятор?
Встречал по крайней мере два варианта:
1) #pragama once в хедере говорит компилятору игнорировать повторные включения этого хедера при компиляции какой-нибудь единицы трансляции
2) #pragma once on или #pragma once off влияет на всю единицу трансляции. Если она on, то никакие хедеры в этой единице повторно не включаются.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>2) #pragma once on или #pragma once off влияет на всю единицу трансляции. Если она on, то никакие хедеры в этой единице повторно не включаются.
Если она такая, то нужно очень аккуратно использовать. Вдруг где-нибудь есть код вида
Здравствуйте, Аноним, Вы писали:
А>Подскажите,чайнику,что означает #pragma once ? А>Спасибо.
// MS compatible compilers support #pragma once.#if defined(_MSC_VER) && (_MSC_VER >= 1020)
# pragma once
#endif
Прелесть этой кухни в том, что файл повторно включаться даже не будет пытаться,
например, часто перед "ifndef/define/endif" находится огромный текст лицензии и т.п., которые препроцессор обрабатывает так или иначе,
в этом случае он такого делать не будет. Увиличится время компиляции (но совсем незаметно :-))
Такая конструкция так-же поддерживается gcc (как минимум тем, что в Mac OS X). Для кросс-платформенного кода рекомендуется использовать так:
Здравствуйте, Кодт, Вы писали:
К>Если она такая, то нужно очень аккуратно использовать. Вдруг где-нибудь есть код вида
Скажу больше. Её вообще лучше использовать очень аккуратно
Скажем те, кто будут нести твой код на другой компилятор возможно не раз помянут тебя незлым тихим словом
Но в целом обычно есть какой-нибудь макрос для сождания нового исходника (у меня, например, он пишет туда кто создал когда, формирует стандартные комменты с описанием того, что должно быть в эсходнике и т. д.)
Вот он и формирует include guards
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, B2BITS, Вы писали:
BBI>Прелесть этой кухни в том, что файл повторно включаться даже не будет пытаться,
Но сейчас кэши файловой системы у компов большие, скорость работы синтаксического анализатора тоже хорошая, так что выигрыш какой-то мизерный возникает
Вот у меня обычно основное время занимает кодогенерация, а вовсе и нихрена не предварительный лексический разбор
BBI>Для кросс-платформенного кода рекомендуется использовать так: BBI>
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, B2BITS, Вы писали:
BBI>Здравствуйте, Аноним, Вы писали:
А>>Подскажите,чайнику,что означает #pragma once ? А>>Спасибо.
BBI>
BBI>// MS compatible compilers support #pragma once.
BBI>#if defined(_MSC_VER) && (_MSC_VER >= 1020)
BBI># pragma once
BBI>#endif
BBI>
BBI>Прелесть этой кухни в том, что файл повторно включаться даже не будет пытаться, BBI>например, часто перед "ifndef/define/endif" находится огромный текст лицензии и т.п., которые препроцессор обрабатывает так или иначе, BBI>в этом случае он такого делать не будет. Увиличится время компиляции (но совсем незаметно
Сам не проверял, но слышал такую вещь, что современные компиляторы распознают include guards и поступают точно так же как и при #pragma once. Но это в принципе и не удивительно, потомучто сделать элементарно.
Здравствуйте, Ovl, Вы писали:
Ovl>Здравствуйте, Аноним, Вы писали:
А>>Подскажите,чайнику,что означает #pragma once ? А>>Спасибо.
Ovl>MS specified форма следующего
Ovl>то есть говорить о том, что файл включается в единицу трансляции только один раз. Ovl>плюс в том, что обработка идет не на уровне дефайнов, и файл второй раз даже не подгружается
Сам не проверял, но слышал такую вещь, что современные компиляторы распознают include guards и поступают точно так же как и при #pragma once. Но это в принципе и не удивительно, потомучто сделать элементарно.