2013-08-03 7 views
1

Некоторые компиляторы C предоставляют -D для определения макроса в командной строке и -U для определения одного (встроенного или определенного с -D).Варианты использования для -U

Я использовал -D, но мне интересно, -U. Каковы случаи, когда это полезно на практике?

+0

Я почти никогда не использовал '-U' в (ouch) 30 лет программирования C. Для этого очень мало случаев использования. –

ответ

1

Вот один случай использования (я уверен, что есть и другие):

Где ваш компилятор Си вызывается из другого приложения, которое генерирует источник для компилятора C, вы не сможете легко получить доступ к источник, чтобы изменить его вручную (хотя большинство таких компиляторов имеют параметр «держать C», редактирование сгенерированного кода вручную - это то, чего следует избегать). Обычно первый компилятор будет иметь множество параметров для установки, а также позволяет передавать дополнительные параметры компилятору C самостоятельно в аргументе «параметры для компилятора C» (например, он может сделать это, чтобы вы могли контролировать оптимизацию компилятора C уровней, не предполагая, что компилятор GCC). И иногда параметры для того, как в конечном счете скомпилировать сгенерированный код, управляются макросами, встроенными в вывод C: поскольку выход не существует в момент ввода параметров командной строки, -U и -D могут быть единственным способом установить эти флаги.

Реальный пример: Gambit-C по умолчанию имеет возможность выводить одну массивную функцию C вместо многих отдельных, что (согласно документам) упрощает компилятор C для оптимизации окончательного кода. Он фактически выводит один и тот же C в любом случае, переключая поведение с макросом __SINGLE_HOST. Но компиляция одной огромной функции может занять вечность (или просто сбой) на более старой машине, поэтому должен быть способ отключить это поведение. -U__SINGLE_HOST как один из переданных аргументов компилятору C, можно фактически скомпилировать проекты Gambit на старых компьютерах, сохраняя при этом некоторый уровень оптимизации.

В этом случае поведение __SINGLE_HOST могло бы быть обработано компилятором Gambit, но, хотя это не является абсолютно необходимым, оно дает больше свободы человеку, проектирующему первый компилятор. Это всегда хорошо.

Более обобщенная версия этого ответа будет заключаться в том, что -U полезен в любое время, когда ваша система сборки передает кучу аргументов -D, и вы не хотите их всех; он может отменить определения по умолчанию после того, как система их установит.

1

я могу думать только о двух случаях, когда это может быть полезно:

  1. Если у вас есть #ifdef MY_MACRO или #ifndef MY_MACRO в вашем коде, и MY_MACRO определяется (вероятно, встроенный, в противном случае вы можете просто удалить его), и вы хотите скомпилировать этот макрос (изменить поведение #ifdef)
  2. Или, если вы хотите переопределить макрос с другим определением, вы должны «сначала» его определить (я должен писать, потому что компилятор жалуется, если вы все равно не работаете, но все работает нормально)
Смежные вопросы