2009-06-22 4 views
2

Посмотрите на следующую программу.Что происходит, когда мы не указываем тип данных аргументов в функции и передаем ему параметры при вызове?

int main() 
{ 
    char a=65, ch ='c'; 
    printit(a,ch); 
} 

printit(a,ch) 
{ 
    printf("a=%d ch=%c",a,ch); 
} 

Даже если тип данных аргументов не задано в функции «printit()», результат показан на Printf. Я вижу правильный ответ, когда компилирую его с помощью gcc и запускаю его. Почему? Нет необходимости указывать тип данных аргументов в C? Каков тип данных по умолчанию для аргумента, принятого в случае, показанном выше?

ответ

3

Единственный тип данных по умолчанию, принятый в C, равен int, как в коде выше.

Новые версии C++ запрещают неявные данные и новые компиляторы C++ отказываются компилировать код выше.

+0

Похоже, что это может перестать работать и в более новых версиях C. В стандарте 2005 C99 + TC1 + TC2 упоминается вперед, что одним из изменений предыдущих версий было «Удалить объявление неявной функции [s]». –

1

Поскольку вы не указываете прототип printit(), компилятор составляет неявное объявление:

int printit(int, int); 

Когда позже компилятор видит определение printit() функции без типов для аргументов, она использует, что неявной декларации.

Очень опасная техника - вы в основном запрещаете проверку типов для этой функции.

+0

Звучит здорово, но как можно доказать, что он работает так, и аргументы не являются обычным int? Я попытался проверить - sizeof (a) и sizeof (ch) есть 4 внутри функции, поэтому, по крайней мере, с VC++ 7 в режиме «скомпилировать как источник C» оба аргумента имеют тип int. – sharptooth

+0

@sharptooth. Вы правы. Отладочная информация показывает, что printit() возвращает int и принимает два значения в качестве параметров. Спасибо за ценный комментарий, я исправил свой ответ. – qrdl

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