Функции C без файлов заголовков

Это должно быть очень тривиально. Я выполнял очень базовую программу для сравнения строк:

#include <stdio.h>  
int strcmp(char *s, char *t);
int main()
{
    printf("Returned: %d\n", strcmp("abc", "adf"));
    return 0;
}

int strcmp(char *s, char *t)
{
    printf("Blah\n");
    while (*s++ == *t++)
    {
        if (*s == '\0')
            return 0;
    }
    return *s - *t;
}

Итак, я в основном реализовал собственную версию функции strcmp, уже присутствующей в string.h. Когда я запускаю вышеуказанный код, я вижу только возвращаемые значения 0, 1 или -1 (по крайней мере, для моего небольшого набора тестовых случаев) вместо фактических ожидаемых результатов. Теперь я понимаю, что это потому, что код не переходит к моей реализованной версии strcmp, но вместо этого использует версию функции string.h, но я в замешательстве, почему это так, даже если я не знаю, t включил соответствующий заголовочный файл.

Также, видя, как он использует версию файла заголовка, не должен ли я получать ошибку "множественных реализаций" (или что-то подобное) при компиляции кода?

Ответы

Ответ 1

Вы используете gcc, правильно? gcc реализует некоторые функции как встроенные в компилятор, и кажется, что strcmp является одним из тех. Попробуйте скомпилировать файл с помощью переключателя -fno-builtin.

Заголовочные файлы просто сообщают компилятору, что существуют определенные символы, макросы и типы. Включение или отсутствие файла заголовка не окажет никакого влияния на функции, связанные с работой компоновщика. Если gcc вытащил strcmp из libc, вы, вероятно, увидите предупреждение.

Ответ 2

Не так элегантно, как более ранние ответы, другой способ сделать это

#include <stdio.h>  
static int strcmp(char *s, char *t); /* static makes it bind to file local sym */
int main()
{
    printf("Returned: %d\n", strcmp("abc", "adf"));
    return 0;
}

int strcmp(char *s, char *t)
{
    printf("Blah\n");
    while (*s++ == *t++)
    {
        if (*s == '\0')
            return 0;
    }
    return *s - *t;
}

Ответ 3

Не зная, что такое компилятор и lib. вы используете, все выводы - это только "возможность". Поэтому самое разумное, что stdio.h уже включает stdlib.h или string.h

Ответ 4

strcmp - это имя стандартной библиотечной функции. Таким образом, вам разрешено объявлять функцию (хотя вы должны использовать правильное объявление); вам не разрешено давать другое определение. Реализация может предполагать, что всякий раз, когда вы используете strcmp, вы ссылаетесь на стандартную библиотечную функцию, даже если вы не использовали для нее правильный #include.

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