C / C ++ определения функций - PullRequest
2 голосов
/ 15 марта 2010

Вчера я смотрел дискуссию о компиляторах и компоновщиках. Речь шла об определениях функций библиотеки C. Я никогда не думал об этом, поэтому это вдохновило меня на некоторые поиски, но я не могу найти именно то, что хочу. Интересно, какой наименьший синтаксис нужно добавить в исходный код, чтобы включить только функцию printf (). Я имею в виду объявление функции из stdio.h вам нужно.

Ответы [ 3 ]

3 голосов
/ 15 марта 2010

Декларация C99 printf() равна

int printf(const char *restrict, ...);

но большинство компиляторов также примут

int printf(const char *, ...);    

См. Также C99, раздел 7.1.4, §2:

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

Примечание: В этом случае квалификатор restrict в сочетании с const обещает компилятору, что строка формата никогда не изменяется в пределах printf(), даже если указатель снова передается как один из Вариативные аргументы.

1 голос
/ 15 марта 2010

Определение обычно компилируется в общей библиотеке. Декларация - это то, что вам нужно. Отсутствие объявления в области видимости вызывает неопределенное поведение. Итак, для каждой библиотеки у вас обычно есть (набор) заголовочных файлов и скомпилированная двоичная разделяемая / статическая библиотека. Вы компилируете свои источники, включая соответствующие заголовки и ссылки на библиотеку. Чтобы ввести объявление в область видимости, используйте директиву #include. Например. для printf вы бы сделали:

#include <stdio.h>
int main() {
    printf("Hello, world\n");
    return 0;
}

Но тогда любая приличная книга на C или C ++ уже должна охватывать это подробно и с лучшими примерами.

0 голосов
/ 15 марта 2010

Зависит от вашего компилятора и платформы.

В большинстве случаев просто объявить

int printf(const char *, ...);

просто сделает, однако ваша конкретная реализация компилятора / платформы или библиотеки C даже может изменить это объявление для целей соглашения о вызовах.

В общем, не стоит пытаться объявлять вещи самостоятельно, поскольку это может быть нарушением правила одного определения. Вы должны всегда включать соответствующий заголовок, stdio.h (cstdio для C ++) в этом случае.

...