Ответ 1
Поскольку у функции есть внешняя связь (не static
), компилятор не может ее устранить, потому что другой объектный файл может ссылаться на нее. Если функция static
, она будет полностью удалена.
В большинстве случаев, если я хочу создать необязательную функцию в C, я просто создаю две функции, такие как:
#ifdef OPTIONAL_SOMETHING
void do_something(int n, const char *s)
{
while (n--) {
printf("%s", s);
}
/* ...You might get the point, really do something... */
}
#else
void do_something(int n, const char *s)
{
/* Empty body */
}
#endif
Итак, если символ undefined - когда функция отключена, в исполняемый файл скомпилируется пустая функция.
Переходя к списку сборок, кажется, что GCC компилирует и вызывает пустые функции, когда оптимизация отключена. Если оптимизация включена, а также с -O2
и -O3
, она компилирует только необходимый код обработки стека, но оптимизирует инструкции по вызову. В целом он сохраняет функцию.
Примерно так же применяется для непустых, но неиспользуемых методов.
Он должен просто выбросить все это, но это не так. Почему это поведение по умолчанию? И только ради любопытства: как я могу это устранить?
Поскольку у функции есть внешняя связь (не static
), компилятор не может ее устранить, потому что другой объектный файл может ссылаться на нее. Если функция static
, она будет полностью удалена.
Если вы хотите, чтобы компилятор в конечном итоге включил функцию, которую вы ему сказали. Объявите свою функцию inline
, это позволяет компилятору не испускать функцию, если она сочтет нужным.
Теперь это может привести к ошибке "undefined" при компиляции с -O0 или около того. Поместите "экземпляр", например
void do_something(int n, const char *s);
только в одном модуле компиляции (файл .c).