У меня есть общее сомнение ..Установки сферы действия MACRO
Есть ли способ, мы ограничиваем сферу действия MACRO в .C файл так же, как статическая функция?
У меня есть общее сомнение ..Установки сферы действия MACRO
Есть ли способ, мы ограничиваем сферу действия MACRO в .C файл так же, как статическая функция?
Вы можете поместить макрос в файл .c, где вы хотите, чтобы он использовался вместо файла заголовка, и он не будет доступен из других файлов (хотя некоторые компиляторы разрешают включение файлов .c, но никто не делает этого что, ну никто не разумный).
Также упоминается использование #undef
, но это может быстро начать запутываться, если вы используете этот макрос.
Макросы выполняются препроцессором. Препроцессор считывает все обрабатываемые файлы и применяет макросы и макро логику, результаты которых затем передаются компилятору.
Как только макрос определен, его значение будет использоваться везде, на которое ссылается макрос, даже в других файлах.
Подробнее об использовании макросов см. В разделе the GCC Documentation.
Общая практика: #undef
макрос, когда вы закончите с ним. Ошибка, но она работает.
Макросы не имеют какого-либо объема блока.
Все макросы уже похожи на статические функции, поскольку они могут использоваться только в единицах перевода, в которых они определены. Если вы хотите ограничить области, в которых вы можете использовать определенный макрос, просто определите его в разумном месте.
макрос оценивается препроцессором, а не компилятором. он ничего не знает о единицах компиляции, поэтому вы не можете ограничить его использование одним. вместо этого оценивается внутри единицы перевода.
жизненный цикл макросов начинается в строке, в которой она определена (все строки над ней ничего не знают о макросе), и она заканчивается либо в конце единицы перевода, либо всякий раз, когда она становится неопределенной, используя «#undef»
Все макросы C ограничены единицей перевода (одним файлом C), если они не определены в заголовке и не включены в каждую единицы перевода.
К сожалению, единица перевода часто бывает большой, от нескольких сотен до тысяч строк кода, а макросы зависят от контекста, и это было бы намного более полезно, если бы его можно было ограничить гораздо меньшим контекстом (например, область блока) , Недостаток области ограничивает использование макросов в C, в основном глобальные константы, несколько универсальных простых подпрограмм и часто требует всех имен капитала или некоторого трюка для управления загрязнением).
Однако функции более высокого порядка могут быть легко достигнуты с помощью макросов. Подумайте о том, как мы используем естественный язык, где мы можем использовать «его» для обозначения слишком долгого повторения в контексте. Масштабная система с областью действия позволит использовать ту же способность.
Я разработал MyDef, который по существу является областью макросистемы.
Ну, * каждый * компилятор позволяет включать .c файлы. И много людей это делают, потому что иногда это * разумно. Ваш основной ответ на ограничение его с помощью единицы перевода кажется разумным. –
@CarlNorum Ну, некоторые люди используют StyleCop или FxCop, где вы действительно можете заставить это быть ошибкой компилятора, по крайней мере, в промышленности. Никогда не думал о сценарии, в котором был включен .c-файл, или не может быть разделен на включение файла .h с открытыми прототипами. –
Ни один из этих инструментов не имеет ничего общего с C, не так ли? И они, конечно, не компиляторы. –