Вчера я смотрел обсуждение здесь, о компиляторах и компоновщиках. Речь шла о определениях функций библиотеки C. Я никогда не думал об этом, поэтому он вдохновил меня на поиски, но я не могу найти то, что хочу. Интересно, какой минимальный синтаксис вам нужно добавить в исходный код, чтобы включить функцию printf(). Я имею в виду объявление функции из stdio.h, которое вам нужно.C/C++ определения функций
ответ
Определение обычно скомпилировано в общей библиотеке. Декларация - это то, что вам нужно. Отсутствие объявления в области вызывает неопределенное поведение. Итак, для каждой библиотеки вы обычно имеете (набор) заголовочных файлов и скомпилированную двоичную общую/статическую библиотеку. Вы скомпилируете свои источники, включив соответствующие заголовки и связавшись с библиотекой. Чтобы ввести декларацию в область действия, используйте директиву #include
. Например. для printf
вы могли бы сделать:
#include <stdio.h>
int main() {
printf("Hello, world\n");
return 0;
}
Но тогда любая приличная книга на C или C++ уже должен охватывать это подробно и с лучшими примерами.
Есть ли способ увидеть фактические определения этих функций? В коде C или ASM? – Vit
C99 декларация printf()
является
int printf(const char *restrict, ...);
но большинство компиляторов также будет принимать
int printf(const char *, ...);
Смотрите также раздел 7.1.4 C99, § 2:
При условии, что библиотечная функция может быть объявлена без ссылки на любой тип, определенный в заголовке , это также pe допустимо объявить функцию и использовать ее без включения связанного заголовка .
Примечание: В этом случае restrict
отборочных в сочетании с const
обещает компилятор, что строка формата никогда не модифицированную в printf()
, даже если указатель передается снова в качестве одного из аргументов переменных числа.
@David: 'ограничение' - это не имя аргумента, а один из трех классификаторов типа C99 (другие -' const' и 'volatile') – Christoph
Я не знал этого, спасибо за разъяснение. –
@ Кристоф: на самом деле 'ограничение' означает, что компилятор может игнорировать сглаживание, и вы * не можете * передать строку формата снова как вариационный аргумент. Если вы передадите его дважды, это неопределенное поведение; см. 6.7.3.1/4 в стандарте C. – 2010-03-15 08:39:43
Это зависит от вашего компилятора и платформы.
В большинстве случаев достаточно просто объявить
int printf(const char *, ...);
будет просто, однако, ваш конкретный компилятор/или платформы реализации библиотеки C может даже изменить это заявление, для вызова целей конвенции.
В целом, не стоит пытаться заявить о себе сами, поскольку это может быть нарушением одного правила определения. В этом случае вы всегда должны включать подходящий заголовок, stdio.h (cstdio для C++).
Это просто для учебных целей ... – Vit
- 1. Определения функций JS порядка
- 2. Определения функций в Clojure
- 3. определения массива функций C
- 4. Поиск определения функций Linux
- 5. Kernel Определения функций
- 6. Определения функций для интерфейсов
- 7. Ошибки определения нескольких функций
- 8. Решения SAT для определения функций многомерных функций?
- 9. Идиоматический способ определения постоянных функций
- 10. Определения функций перенаправления в python
- 11. Определения переменных функций внутри цикла?
- 12. Определения функций вне структуры C++
- 13. Golang: Функция определения арности функций?
- 14. ASDoc игнорирует определения публичных функций?
- 15. Regex для определения функций C#
- 16. Определение макроса для определения функций
- 17. Определения друг функций и классов
- 18. определения функций с/без лямбды
- 19. Перенаправление определения функций в Python
- 20. определения функций в angularjs константы
- 21. определения функций в Haskell интерактивные
- 22. Определения функции внутри других функций
- 23. Оператор присваивания Python, определения функций и определения переменных
- 24. Почему возможно определить определения функций друга внутри определения класса?
- 25. Заказ функций определения пользователем внутри другой функции определения пользователя PHP
- 26. Компиляторы: как разбирать вызовы функций и определения функций
- 27. Как создать std :: вектор функций без однозначного определения функций?
- 28. Разбирать докблоки вызовов функций, а не определения функций?
- 29. Что такое «var cc = cc = cc || {};» line делать в Cocos2D?
- 30. Haskell просматривает определения вложенных функций, используя где
Зачем вам это нужно? Какая выгода дает вам краткость? Для * printf * в частности, ваша библиотека может быть (немного) более подробной, чтобы отметить функцию как та, которая требует проверки спецификаторов формата (например, gcc делает это с включенным '-Wformat'). Сообщая нам, почему вы не хотите включать, мы можем предоставить лучшее решение. –
2010-03-15 08:57:09
Это просто, я просто хочу лучше понять путь от printf() до фактического кода. Есть ли хорошие статьи в Интернете? В моей стране многие книги недоступны. – Vit
Вы хотите написать свою собственную функцию, назовем ее 'my_printf', которая ведет себя идентично стандарту' printf'? – 2010-03-15 11:32:38