без учета - PullRequest
       55

без учета

5 голосов
/ 11 января 2011

ниже данная программа работает без включения <stdio.h>? Почему это работает?

int main()
{
    printf("integra");
    return 0;
}

Ответы [ 6 ]

8 голосов
/ 12 января 2011

Определение printf () есть в libc.so, и динамический компоновщик позаботится об этом, даже если вы не включите заголовочный файл.Во время компиляции printf () будет неопределенным символом, и предполагается, что он может найти определение позже в libc.Заголовочный файл просто даст прототип и подавит компилятор (предупреждения), заявив, что определение прототипа присутствует в glibc.Таким образом, в основном, заголовочные файлы включены просто для того, чтобы убедиться, что определения доступны в наших библиотеках, чтобы помочь разработчику.

7 голосов
/ 11 января 2011

в старом стандарте, необъявленная функция принимает int аргумент и возвращаемое значение. Ваш char* имеет тот же размер (32-разрядный), что и int, поэтому все работает.

Только не делай этого.

5 голосов
/ 11 января 2011

printf () определяется только в libc.so

Динамический компоновщик разрешит символ printf () в libc, поскольку вы его не включили

libc по умолчанию в gcc для каждой программы

3 голосов
/ 12 января 2011

Как отметил Аби, ваш код успешно собирается без включения stdio.h, поскольку компоновщик по умолчанию использует системную библиотеку std для неопределенного символа (printf).GCC обычно предупреждает вас о таких случаях.

Пусть test.c будет:

1: int main()
2: {
3:    printf("test\n");
4:    return 0;
5: }

Сборка test.c с GCC 4.2.1 на Mac OSX:

$ gcc test.c
test.c: In function ‘main’:
test.c:3: warning: incompatible implicit declaration of built-in function ‘printf’
$ ./a.out
test

Вы можете отключить это связывание по умолчанию, выполнивуказание опции компоновщика GCC -nostdlib (или -nodefaultlibs) вместе с -lgcc (как рекомендует руководство GCC):

$ gcc -nostdlib -lgcc test.c
test.c: In function ‘main’:
test.c:3: warning: incompatible implicit declaration of built-in function ‘printf’
Undefined symbols:
  "_puts", referenced from:
      _main in cc3bvzuM.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
$
1 голос
/ 11 января 2011

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

Если это предположение совпадает с определением функции, и если предоставленные вами аргументы также совпадают (по модулю продвижения аргументов по умолчанию) с параметрами, которые функция ожидает получить, то все в порядке.
Если предположение неверно (например, для printf, который является переменной функцией), или если аргументы не совпадают, результаты не определены. Одной из неприятных особенностей неопределенного поведения является то, что оно может работать должным образом.

1 голос
/ 11 января 2011

Некоторые (старые?) Компиляторы не требуют прототипов перед вызовом функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...