Подтвердить что ты не робот

Почему GCC сохраняет пустые функции?

В большинстве случаев, если я хочу создать необязательную функцию в 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, она компилирует только необходимый код обработки стека, но оптимизирует инструкции по вызову. В целом он сохраняет функцию.

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

Он должен просто выбросить все это, но это не так. Почему это поведение по умолчанию? И только ради любопытства: как я могу это устранить?

4b9b3361

Ответ 1

Поскольку у функции есть внешняя связь (не static), компилятор не может ее устранить, потому что другой объектный файл может ссылаться на нее. Если функция static, она будет полностью удалена.

Ответ 2

Если вы хотите, чтобы компилятор в конечном итоге включил функцию, которую вы ему сказали. Объявите свою функцию inline, это позволяет компилятору не испускать функцию, если она сочтет нужным.

Теперь это может привести к ошибке "undefined" при компиляции с -O0 или около того. Поместите "экземпляр", например

void do_something(int n, const char *s);

только в одном модуле компиляции (файл .c).