Стандартные функции определены в заголовочных файлах или автоматически связаны? - PullRequest
0 голосов
/ 14 ноября 2011

При написании базовой программы c.

#include <stdio.h>

main(){
  printf("program");
}

Это определение printf в "stdio.h" или функция printf автоматически связана?

Ответы [ 3 ]

3 голосов
/ 14 ноября 2011

Обычно в stdio.h есть только прототип;определение должно быть внутри библиотеки, с которой ваш объектный модуль автоматически связан (различные msvcrt для VC ++ в Windows, libcsomething для gcc в Linux).

Кстати, это <stdio.h>, а не "stdio.h".

2 голосов
/ 14 ноября 2011

Обычно они автоматически связываются, но компилятору разрешается реализовывать их по своему усмотрению (даже с помощью магии компилятора).

Все еще необходимо #include, поскольку оно вводит стандартные функции в область видимости.

1 голос
/ 14 ноября 2011

Stricto sensu, компилятор и компоновщик - это разные вещи (и я не уверен, что стандарт C говорит о компиляции и компоновке, он более абстрактно говорит о проблемах перевода и реализации).

Например, в Linux вы часто используете gcc для перевода вашего hello.c исходного файла, а gcc - это «управляющая программа», которая запускает компилятор cc1, ассемблер as, компоновщик ld и т. Д.

В Linux заголовок <stdio.h> - это обычный файл. Запустите gcc -v -Wall -H hello.c -o hello, чтобы понять, что происходит. Опция -v просит gcc показать вам используемые программы (cc1 и другие). Флаг -Wall запрашивает все предупреждения (не игнорируйте их!). Флаг -H просит компилятор показать вам файлы заголовков, которые включены.

Заголовочный файл /usr/include/stdio.h является #include -из себя другими заголовками. В какой-то момент объявление printf видно, и компилятор анализирует его и соответственно корректирует его состояние.

Позже команда gcc запустит компоновщик ld и попросит его связать стандартную библиотеку C (в моей системе /usr/lib/x86_64-linux-gnu/libc.so). Эта библиотека содержит код [object] printf

Я не уверен, что понял ваш вопрос. Чтение страницы Википедии о компиляторах , компоновщиках , ядре Linux , системных вызовах должно быть полезно.

Вы не должны хотеть gcc автоматически связывать ваши собственные дополнительные библиотеки. Это было бы сбивающим с толку. (но если вы действительно хотите сделать это с GCC, прочитайте о файле спецификаций GCC )

...