Вот один случай использования (я уверен, что есть и другие):
Где ваш компилятор Си вызывается из другого приложения, которое генерирует источник для компилятора 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
, и вы не хотите их всех; он может отменить определения по умолчанию после того, как система их установит.
Я почти никогда не использовал '-U' в (ouch) 30 лет программирования C. Для этого очень мало случаев использования. –