2011-03-17 43 views
0

C中的变量长度参数列表函数如printf() , scanf(), etc如何与C++中的函数重载不同?在C中重载还是不重载?

以及如何调用

printf("Didnt Work %s",s);

printf(s,"Didnt Work %s");

不同,其中S定义为:

const char *s="string"; 

请解释。

回答

6

const char *s="string"; 
printf(s,"Didnt Work %s"); 

的第一个参数 “串” 被解释为格式字符串。它没有插入代码,所以第二个参数不会被使用。结果将是“字符串”。

OTOH

printf("Didnt Work %s",s); 

有插入的代码,所以第二个参数被插入一个字符串,其结果是“没有工作字符串”。

这不是重载,因为虽然不同的参数类型是可能的,就像在重载中一样,但在变量参数中总是调用相同的函数。随着重载,根据参数类型调用不同的函数。

0

重载允许编译器检查参数的特定顺序。在C++中,如果至少有一个函数定义的类型不匹配,编译器会发出抱怨。另一方面,具有可变长度参数的C,在编译时没有这种类型检查。编译器不检查任何参数以确保它们排队。如果不是全部编译器,则可以编译printf("1",3);。 Printf将尝试将第一个参数作为字符串读取,并将继续读取,直到它到达表示字符串结尾的空字节。这就是为什么不鼓励变长参数列表的原因。

+1

'printf(1,3);'不会在任何编译器上编译。 “printf”的第一个参数是键入的,也就是说,它需要一个“const char *”。但是你的论点在变长参数不安全的原则上是正确的。 – 2011-03-17 06:09:29

+0

你是完全正确的。我应该解决这个问题... – datdo 2011-03-17 15:08:46

0

要回答你的第二个问题,其他人已经第一个问题了。

C中的变量参数列表与C++中的重载非常不同。在C语言中,你有一个函数printf,它可能对不同类型的参数做不同的事情。在C++中,通过重载,您可以根据参数的类型在不同的函数中进行选择。