параметры по умолчанию при вызове функции в C - PullRequest
3 голосов
/ 07 февраля 2012

Допустим, в файле есть код в двух файлах, принадлежащих одному и тому же проекту

file1.c
int func1(int a, int b, int c, bool d)
{
        /* function body */
}

file2.c
extern func1(int a, int b, int c);

/* function call */
func1(runtime1, runtime2, runtime3);

Что будет принимать значение bool d при вызове из file2.c? Я знаю, что это действительно плохая практика, но я поддерживаю старый код, и кто-то сделал это, я просто хочу знать параметр по умолчанию или, если это зависит от реализации. Также обратите внимание, что bool в этом примере является typedef программного обеспечения, так как этот конкретный проект не поддерживает C99. Спасибо.!

Ответы [ 5 ]

4 голосов
/ 07 февраля 2012

Значение будет неопределенным. При вызове func1 его параметры отправляются в стек. Если вы вызовете его с 1 параметром меньше, стек будет на sizeof(bool) байт меньше, чем ожидает процесс. Это не приведет к сбою вашей программы, так как ваш стек и куча «обращены», но если вы попытаетесь получить доступ к d, вы получите доступ к любому значению, которое есть в стеке -> мусор.

4 голосов
/ 07 февраля 2012

Значение не только зависит от реализации;все поведение программы не определено.Если вы поместите объявление для func1 в заголовок вместо file2.c и включите этот заголовок в file1.c, что является хорошей практикой C, компилятор откажется компилировать это.

На практике вы, вероятно, заметите, что d имеет какое-то произвольное, непредсказуемое значение, хотя ваша программа также может таинственным образом зависать.

1 голос
/ 07 февраля 2012

Эта программа неопределенное поведение . Поскольку программа имеет неопределенное поведение, компилятор имеет право отказаться от ее компиляции.

(C99, 6.2.7p2) "Все объявления, которые ссылаются на один и тот же объект или функцию, должны иметь совместимый тип; в противном случае поведение не определено."

Два объявления функций в вашей программе несовместимы; они не имеют одинакового количества параметров.

(C99, 6.7.5.3p15) "Для совместимости двух типов функций оба должны указывать совместимые типы возвращаемых данных. Кроме того, списки типов параметров, если оба присутствуют, должны согласовываться по количеству параметров и при использовании терминатор с многоточием; соответствующие параметры должны иметь совместимые типы. "

0 голосов
/ 07 февраля 2012

Это неопределенное поведение - оно может иметь значение мусора, а также может зависать, в зависимости от соглашения о вызовах вашего компилятора и ОС.

Редактировать: другие аргументы также могут быть смешаны, если они были сдвинуты слева направо.

0 голосов
/ 07 февраля 2012

Это может быть любое значение, мусор из стека, я полагаю, если вы вызываете метод таким образом.

Программа будет иметь неопределенное поведение, потому что вы действительно не знаете значение параметра bool. Также может произойти сбой во время выполнения.

Надеюсь, это поможет.

...