2012-04-04 2 views

ответ

2

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

Также упоминается использование #undef, но это может быстро начать запутываться, если вы используете этот макрос.

+2

Ну, * каждый * компилятор позволяет включать .c файлы. И много людей это делают, потому что иногда это * разумно. Ваш основной ответ на ограничение его с помощью единицы перевода кажется разумным. –

+0

@CarlNorum Ну, некоторые люди используют StyleCop или FxCop, где вы действительно можете заставить это быть ошибкой компилятора, по крайней мере, в промышленности. Никогда не думал о сценарии, в котором был включен .c-файл, или не может быть разделен на включение файла .h с открытыми прототипами. –

+1

Ни один из этих инструментов не имеет ничего общего с C, не так ли? И они, конечно, не компиляторы. –

2

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

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

Подробнее об использовании макросов см. В разделе the GCC Documentation.

3

Общая практика: #undef макрос, когда вы закончите с ним. Ошибка, но она работает.

Макросы не имеют какого-либо объема блока.

2

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

0

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

жизненный цикл макросов начинается в строке, в которой она определена (все строки над ней ничего не знают о макросе), и она заканчивается либо в конце единицы перевода, либо всякий раз, когда она становится неопределенной, используя «#undef»

0

Все макросы C ограничены единицей перевода (одним файлом C), если они не определены в заголовке и не включены в каждую единицы перевода.

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

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

Я разработал MyDef, который по существу является областью макросистемы.