2010-03-15 3 views
2

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

+1

Зачем вам это нужно? Какая выгода дает вам краткость? Для * printf * в частности, ваша библиотека может быть (немного) более подробной, чтобы отметить функцию как та, которая требует проверки спецификаторов формата (например, gcc делает это с включенным '-Wformat'). Сообщая нам, почему вы не хотите включать , мы можем предоставить лучшее решение. – 2010-03-15 08:57:09

+0

Это просто, я просто хочу лучше понять путь от printf() до фактического кода. Есть ли хорошие статьи в Интернете? В моей стране многие книги недоступны. – Vit

+0

Вы хотите написать свою собственную функцию, назовем ее 'my_printf', которая ведет себя идентично стандарту' printf'? – 2010-03-15 11:32:38

ответ

1

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

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

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

+0

Есть ли способ увидеть фактические определения этих функций? В коде C или ASM? – Vit

3

C99 декларация printf() является

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

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

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

Смотрите также раздел 7.1.4 C99, § 2:

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

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

+2

@David: 'ограничение' - это не имя аргумента, а один из трех классификаторов типа C99 (другие -' const' и 'volatile') – Christoph

+1

Я не знал этого, спасибо за разъяснение. –

+0

@ Кристоф: на самом деле 'ограничение' означает, что компилятор может игнорировать сглаживание, и вы * не можете * передать строку формата снова как вариационный аргумент. Если вы передадите его дважды, это неопределенное поведение; см. 6.7.3.1/4 в стандарте C. – 2010-03-15 08:39:43

0

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

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

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

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

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

+0

Это просто для учебных целей ... – Vit

Смежные вопросы