2013-11-24 2 views
-1

Итак, я никогда не осознавал этого, пока не сделал это случайно. Ниже приведен заголовок метода у меня есть:Как c разрешить вам не передавать все параметры?

void processI_TypeInstruction(char *I_TypeInstruction, char* currentLine, 
     FILE *outputFilePointer, VariableVector *labelVector); 

один из моих вызовов этого метода выглядит следующим образом:

processI_TypeInstruction("lw", line1, outputFile); 

и все мои тесты пройдены и все работает. Мне было интересно, что C делает эту работу? Благодарю.

+2

ненавижу быть педантичным, но разве не так глупо говорить о методах в C? –

+0

Вы уверены, что это C, а не C++? – Havenard

+0

Есть ли способ проверить затмение? –

ответ

3

Вы не должны иметь заголовочный файл с prototype для processI_TypeInstruction в файле с этим вызовом.

Функциональные прототипы не требуются в C. Если функция не имеет прототипа, компилятор не делает предположений о количестве параметров, поэтому он позволит вам передавать любое количество параметров в вызове функции. Это поведение исходного языка. Прототипы функций не были добавлены до 1989 года.

Звонок работает, потому что у C calling convention вызывающий абонент очищает стек. Поскольку вызывающий абонент знает, сколько параметров было передано, он может очистить все переданные им параметры. Конечно, если функция пытается получить доступ к параметру, тогда он будет считывать в неинициализированное пространство стека и кто знает, что произойдет.

+0

Но компилятору все равно нужно было бы знать, «какую функцию он говорит», когда решает, какой адрес он сделает «вызов», поэтому для компиляции в какой-то момент ему придется подключать точки, а когда это произойдет, Не думайте, что он проигнорирует объявление функции. Altrough Я знаю, что вы сказали о стеке правильно, я не вижу, как компилятор может выполнять свою работу, пока «случайно» позволяет это произойти в одно и то же время. – Havenard

+2

@Havenard - компилятор не должен знать об этом. C компилирует каждый файл как независимый блок. Если функция реализовала другой файл, компилятор ничего не знает о другой функции. Все, что он делает, это сохранить имя функции и позволить компоновщику подключить вызов, а компоновщик не имеет информации о том, какие параметры выполняет функция, просто имеет имя. – shf301

+0

Да, смотря так, я думаю, это может сработать. – Havenard

1

Это, безусловно, должна быть ошибка компиляции в C, однако, C++ выполняет функцию поддержки перегрузки (то же самое имя функции, различное количество аргументов, другая функция подписи) ...

+0

C не поддерживает перегрузку. – Havenard

+0

@Havenard Спасибо за исправление. –

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