C-функции без заголовочных файлов - PullRequest
14 голосов
/ 08 мая 2011

Это должно быть очень тривиально. Я запускал очень простую программу на 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, но я не совсем понимаю, почему это так, даже если у меня нет т включил соответствующий заголовочный файл.

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

Ответы [ 4 ]

14 голосов
/ 08 мая 2011

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

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

6 голосов
/ 08 мая 2011

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

#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;
}
1 голос
/ 08 мая 2011

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

0 голосов
/ 08 мая 2011

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

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

...