C中的变量长度参数列表函数如printf() , scanf(), etc
如何与C++中的函数重载不同?在C中重载还是不重载?
以及如何调用
printf("Didnt Work %s",s);
从
printf(s,"Didnt Work %s");
不同,其中S定义为:
const char *s="string";
请解释。
C中的变量长度参数列表函数如printf() , scanf(), etc
如何与C++中的函数重载不同?在C中重载还是不重载?
以及如何调用
printf("Didnt Work %s",s);
从
printf(s,"Didnt Work %s");
不同,其中S定义为:
const char *s="string";
请解释。
在
const char *s="string";
printf(s,"Didnt Work %s");
的第一个参数 “串” 被解释为格式字符串。它没有插入代码,所以第二个参数不会被使用。结果将是“字符串”。
OTOH
printf("Didnt Work %s",s);
有插入的代码,所以第二个参数被插入一个字符串,其结果是“没有工作字符串”。
这不是重载,因为虽然不同的参数类型是可能的,就像在重载中一样,但在变量参数中总是调用相同的函数。随着重载,根据参数类型调用不同的函数。
重载允许编译器检查参数的特定顺序。在C++中,如果至少有一个函数定义的类型不匹配,编译器会发出抱怨。另一方面,具有可变长度参数的C,在编译时没有这种类型检查。编译器不检查任何参数以确保它们排队。如果不是全部编译器,则可以编译printf("1",3);
。 Printf将尝试将第一个参数作为字符串读取,并将继续读取,直到它到达表示字符串结尾的空字节。这就是为什么不鼓励变长参数列表的原因。
要回答你的第二个问题,其他人已经第一个问题了。
C中的变量参数列表与C++中的重载非常不同。在C语言中,你有一个函数printf
,它可能对不同类型的参数做不同的事情。在C++中,通过重载,您可以根据参数的类型在不同的函数中进行选择。
'printf(1,3);'不会在任何编译器上编译。 “printf”的第一个参数是键入的,也就是说,它需要一个“const char *”。但是你的论点在变长参数不安全的原则上是正确的。 – 2011-03-17 06:09:29
你是完全正确的。我应该解决这个问题... – datdo 2011-03-17 15:08:46