g cc функция компиляции в ifdef - PullRequest
0 голосов
/ 09 января 2020

У меня есть этот код

#include <stdio.h>

void test2()
{
    printf("start test2\n");

    printf("end test2\n");
}

void main ()
{

    printf("abc\n");
    #ifdef A
        test2();
    #endif

}

, скомпилируйте его с gcc test.c -o test -static -D B

, когда я запускаю программу, я вижу, что test2 не запускается (это хорошо)

Но когда я запускаю строки, я вижу это end test2 в двоичном файле. Почему? g cc не нужно было его компилировать!

Когда я компилирую этот код

#include <stdio.h>
void test1();
void test2()
{
    printf("start test2\n");
    test1();
    printf("end test2\n");
}

void main ()
{

    printf("abc\n");
    #ifdef A
        test2();
    #endif

}

с gcc test.c -o test -static -D B

G cc, скажите мне, что undefined reference to 'test1' почему? Я не хотел, чтобы g cc даже выполнял функцию компиляции test2, поэтому g cc не нужно было знать, что я использовал эту неопределенную функцию.

Что я могу сделать, чтобы g cc не смотреть на test2, когда я прохожу -D, что не равно A?

Ответы [ 3 ]

3 голосов
/ 09 января 2020

Функция test2 все еще может вызываться из функции во внешнем модуле, даже если вы не вызываете ее здесь, поэтому определение функции должно существовать.

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

1 голос
/ 09 января 2020

Ваш подход немного напоминает высказывание: «Если я не смотрю на дерево, дерева больше нет». что, конечно, не соответствует действительности.

Если вы не хотите включать функцию в свою программу, удалите ее. (И все ссылки на него)

#include <stdio.h>
void test1();

#ifdef A
void test2()
{
    printf("start test2\n");
    test1();
    printf("end test2\n");
}
#endif

int main (void)
{
    printf("abc\n");
    #ifdef A
        test2();
    #endif
}
1 голос
/ 09 января 2020

По умолчанию компоновщик не удаляет мертвый код.

use: -fdata-sections -ffunction-sections -fdce- -Wl,--gc-sections -static опция командной строки

...