LINUX.ORG.RU

Вопрос знатокам стандарта C (и gcc).


0

0

Добрый день!
Есть вот такой исходник test.c:
#include <stdio.h>
#include <stdlib.h>

int main( int argc, char ** argv )
{
int a;

qwerty();
qwerty( 5 );
qwerty( 1, 2 );
qwerty( -2, -3, -4 );
return( 0 );
}

int qwerty( int a, int b )
{
printf( "a==%d, b==%d, marsian==%d\n", a, b, *(&a+2) );
return( 0 );
}

Вот так вот собираю:
gcc -o test test.с

Вот что получаю при запуске:
a==0, b==134518620, marsian==-1079075352
a==5, b==134518620, marsian==-1079075352
a==1, b==2, marsian==-1079075352
a==-2, b==-3, marsian==-4

Доп. информация:
компилятор - gcc (GCC) 4.3.2 20081105 (Red Hat 4.3.2-7)
ОС - Fedora 10.

Вот непосредственно сам(и) вопрос(ы):
1. Разве не должен компилятор заругаться, встретив необъявленную ранее функцию (qwerty)?
2. В случае двухпроходной компиляции разве не проверяется на соответствие список формальных параметров списку фактических?

С уважением.

PS. Если что-то не то спросил, не пеняйте сильно.
PSS. Плюсовый компилятор ругается:
test.c: In function ‘int main(int, char**)’:
test.c:10: error: ‘qwerty’ was not declared in this scope


> 1. Разве не должен компилятор заругаться, встретив необъявленную ранее функцию (qwerty)?

Нужно указать соответствующий флаг. -Wmissing-declarations, вроде. Или -Wall.

> 2. В случае двухпроходной компиляции разве не проверяется на соответствие список формальных параметров списку фактических?

Компилятор не обязан этого делать.

tailgunner ★★★★★
()

насчет "Разве не должен компилятор заругаться, встретив необъявленную ранее функцию (qwerty)? " - есть такое дело, у человека под debian'ом его код собирался( а также в MSVC ), а у меня в убунте - нет( как раз из-за "was not declared in this scope" ), как по мне компилятор обязан ругаться на такие вещи - но это только мое скромное некомпетентное мнение :)

lester ★★★★
()

gcc -Wall -ansi -pedantic /tmp/1.c -o /tmp/test
/tmp/1.c: В функции ‘main’:
/tmp/1.c:8: предупреждение: неявная декларация функции ‘qwerty’
/tmp/1.c:6: предупреждение: неиспользуемая переменная ‘a’

Werehuman ★★
()

Дык по стандарту вроде необьявленные функции считаются int foo () т.е. возвращающими int и с произвольным списком любых параметров. Это потом уж задача линкера найти нужный символ. А компилятор просто параметры в стек положит и все.

imp ★★
()

Если функция не объявлена явно, то компилятор будет считать её как int qwerty(...);

Reset ★★★★★
()

c99 (он же gcc -std=c99) пишет варнинги без дополнительного накручивания болтливости. ЕМНИП, как раз в C99 подобные безобразия были объявлены устаревшими.

const86 ★★★★★
()

Блин. В МГУ этим валят студентов.

Не знаешь элементарные вещи стандарта - получаешь сразу неут

А еще не забываем, что по умолчанию у нас stdcall, а это не всегда так, для например "..." требуется чтобы стек разрушался в вызываемом кода

namezys ★★★★
()
Ответ на: комментарий от namezys

> А еще не забываем, что по умолчанию у нас stdcall...

o.O

k_andy ★★★
()
Ответ на: комментарий от namezys

> Блин. В МГУ этим валят студентов.

> Не знаешь элементарные вещи стандарта - получаешь сразу неут

> А еще не забываем, что по умолчанию у нас stdcall

Бгг. Как же ты проскочил-то?

tailgunner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.