В чем разница между неопределенным значением no аргументов и переменным no аргументов, передаваемых в функцию C? - PullRequest
0 голосов
/ 11 июля 2019
#include <stdio.h>
#define L 11

int oo1(){
printf("oooooo\n");
}

int oo2(int C ,...)
{
 //some code here
 printf("in oo2\n");
}
int main(void){
 oo1();
 oo1(1,4,7,"f");
 oo2(2);
 oo2(2,5,7,3,11);
 printf("%d\n",L);
}

ВЫХОД:

oooooo

oooooo

in oo2

in oo2

11

Этот код имеет 2 функции oo1 и oo2. oo2 - это функция, которая принимает переменное число аргументов. Тем не менее, oo1 принимает переменную или любое количество аргументов, как кажется. В чем разница между этими двумя и как они работают? Любая ссылка или ссылка будет полезна, если это кажется слишком очевидным. Благодарю .

1 Ответ

3 голосов
/ 11 июля 2019

Разница в том, что не определено, что происходит для oo1.

oo1 принимает переменную или любое количество аргументов, как кажется

Стандарт C делаетне гарантирую этого.Фактически, все, что стандарт C говорит по этому поводу, заключается в том, что функция определение с пустым списком аргументов совместима с объявлением функции со списком аргументов void (ИСО / МЭК 9899 6.9.1,сноска 162).

То есть определение функции

int oo1() {…}

совместимо с объявлением прототипа

int oo1(void);

Другими словами, единственная безопасная вещь, которую вы можетеdo это вызвать oo1 без аргументов.Но компилятор C не обязан диагностировать нарушения этого.Тем не менее, современный компилятор C будет предупреждать:

предупреждение: слишком много аргументов при вызове 'oo1'

Обратите внимание на это предупреждение.Вы не должны вызывать oo1 с какими-либо аргументами.

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