对C++之父的一个不解。

时间:2021-02-13 19:53:31
《C++程序设计语言》十周年特别版第138页(第7章6节)有一行printf的声明:

int printf(const char * ...); //大家请看,省略号前没有逗号。

他说这描述的是C标准库函数,而与C++兼容的c89标准规定必须要加逗号。

从未在任何C/C++实现里看到这样的声明。

真是不解Bjarne Stroustrup博士为何为引入这样的别名。

实在是别扭。

82 个解决方案

#1


不止没有逗号,连形参名也没有呀。呵呵

#2


就好像
名人写错字,叫通假字
非名人写错字,叫错别字

#3


这。。。。。似乎没见过

#4


楼主看的中文版的还是英文版的?

#5


right  名人效应
引用 2 楼 bdmh 的回复:
就好像
名人写错字,叫通假字
非名人写错字,叫错别字

#6


不是翻译错误?

#7


头文件里确实有个逗号
int __cdecl printf(const char *, ...);

MSDN里又是这样写的
int printf( const char *format [, argument]... );

不明白什么意思

#8


回1楼,没形参名很正常,因为C标准规定可以没有。
回2楼,加不加逗号,C++标准都支持。
我理解声明struct变量可以不用带struct,因为它是一个类。
但就不理解变参函数声明要少一个逗号,而少一个逗号又换来多少的好处呢?
用少敲一个字母来表示与C的不同?那为何还要兼容C的带逗号方法呢?
多一种写法企不造成多一点的混乱?

真是不解。

#9


lz看的真细啊,写篇论文吧

#10


引用 7 楼 udbwcso 的回复:
头文件里确实有个逗号
int __cdecl printf(const char *, ...);

MSDN里又是这样写的
int printf( const char *format [, argument]... );

不明白什么意思

msdn的声明里的那个中括号里的内容可以没有也可以有连续的多个。照此语法省略号前是不用加逗号的。
在微软的vc环境里只支持C++,对C已经不再正眼相看(也许背地里微软会大量的使用C,那也不可知)。

#11


楼主, 其实, 我是来拿分得~

#12


无它,简洁而已。

#13


无它,其他人觉得有这个,别扭。

#14


引用 13 楼 taodm 的回复:
无它,其他人觉得有这个,别扭。

C语言向来都是加逗号的。而且C语言别扭的地方不止一处,C++更改变参这点语法只是一个别名而已。

#15


C++对变参的更改可不只这一点点的。是有比较重大的更改的。

#16


个人理解:
int printf(const char * ,...):如没第二个形参,那这里的逗号是否要保留,这就存在歧义;
int printf(const char * ...):这样说明的是当有多个形参时,可在补充,但要不要逗号,按C标准执行;
所以,没有逗号我认为是较为合理的。

#17


引用 16 楼 qiuping_chi 的回复:
个人理解:
int printf(const char * ,...):如没第二个形参,那这里的逗号是否要保留,这就存在歧义;
int printf(const char * ...):这样说明的是当有多个形参时,可在补充,但要不要逗号,按C标准执行;
所以,没有逗号我认为是较为合理的。

意思都一样,Bjarne StroustrupS博士并无注释说明这种方便。

我认为是徒添一小混乱罢了。

#18


parameter-declaration-clause:
      parameter-declaration-list[opt] ...[opt]
      parameter-declaration-list , ...

C++里的确可以省去...前的逗号。

#19


呵呵,通假字

#20


该回复于2011-09-13 09:55:58被版主删除

#21


该回复于2011-09-13 09:48:32被版主删除

#22


特来接分 对C++之父的一个不解。

#23


不懂…… 

#24


可能是笔误,如果是译的,可能是译的问题

#25


之前也想过这个问题... 

#26


楼主, 其实, 我是来拿分得~

#27


该回复于2011-09-13 09:54:47被版主删除

#28


该回复于2011-09-13 09:47:09被版主删除

#29


逗号不是必须的--------只要理解这一点,就OK了。

#30


思想永远比文字重要!

#31


路过,说的是

#32


有逗号啊...

#33


要学楼主学习啊,看得好细

#34


就好像
名人写错字,叫通假字
非名人写错字,叫错别字

#35


LZ,要跟你学习

#36


ljljlj回答得不错。

#37


要用这种精神学习呀  

#38


其实我很想知道他的名字怎么读  问10个10都不会读、 对C++之父的一个不解。

#39


精社可嘉,但是不一定是作者的错哟。

#40


...是什么意思。好像以前在书里见过,是在想不起来了。有知道的给说一下。

#41


都是法国

#42


其实看到MSDN上的声明就已经很清楚了:
int printf( const char *format [, argument]... );

这个逗号只有在有第二个参数的时候才能要,如sprintf("abc");就不需要。

sprintf("abc%s","abc");就需要。

对了吧、、、、、

#43


引用 1 楼 mengmingtao 的回复:
不止没有逗号,连形参名也没有呀。呵呵


声明可以不加形参名

#44


该回复于2011-09-14 15:41:46被版主删除

#45


同意16楼的解释,我个人觉得C++的任何一点改变都是经过仔细推敲的,这里之所以不加逗号是因为逗号作为参数分割符,在函数参数列表处存在一个逗号必然会应该有两个参数的通常想法里(当然实际这个就是特例),如果上述声明如果有逗号是否就意味着参数不得少于两个,而没有逗号就是明确的这个函数可以只传一个参数。

#46


过来看看

#47


引用 42 楼 nlqlove 的回复:
其实看到MSDN上的声明就已经很清楚了:
int printf( const char *format [, argument]... );

这个逗号只有在有第二个参数的时候才能要,如sprintf("abc");就不需要。

sprintf("abc%s","abc");就需要。

对了吧、、、、、
对了

#48


名人写错字,叫通假字
非名人写错字,叫错别字

#49


这种事情,问编译器就好了。写个测试程序,编译通过就没问题,没通过要么是编译器不支持,要么就是书写/印错了。

#50


存在,必然有其理由.

#1


不止没有逗号,连形参名也没有呀。呵呵

#2


就好像
名人写错字,叫通假字
非名人写错字,叫错别字

#3


这。。。。。似乎没见过

#4


楼主看的中文版的还是英文版的?

#5


right  名人效应
引用 2 楼 bdmh 的回复:
就好像
名人写错字,叫通假字
非名人写错字,叫错别字

#6


不是翻译错误?

#7


头文件里确实有个逗号
int __cdecl printf(const char *, ...);

MSDN里又是这样写的
int printf( const char *format [, argument]... );

不明白什么意思

#8


回1楼,没形参名很正常,因为C标准规定可以没有。
回2楼,加不加逗号,C++标准都支持。
我理解声明struct变量可以不用带struct,因为它是一个类。
但就不理解变参函数声明要少一个逗号,而少一个逗号又换来多少的好处呢?
用少敲一个字母来表示与C的不同?那为何还要兼容C的带逗号方法呢?
多一种写法企不造成多一点的混乱?

真是不解。

#9


lz看的真细啊,写篇论文吧

#10


引用 7 楼 udbwcso 的回复:
头文件里确实有个逗号
int __cdecl printf(const char *, ...);

MSDN里又是这样写的
int printf( const char *format [, argument]... );

不明白什么意思

msdn的声明里的那个中括号里的内容可以没有也可以有连续的多个。照此语法省略号前是不用加逗号的。
在微软的vc环境里只支持C++,对C已经不再正眼相看(也许背地里微软会大量的使用C,那也不可知)。

#11


楼主, 其实, 我是来拿分得~

#12


无它,简洁而已。

#13


无它,其他人觉得有这个,别扭。

#14


引用 13 楼 taodm 的回复:
无它,其他人觉得有这个,别扭。

C语言向来都是加逗号的。而且C语言别扭的地方不止一处,C++更改变参这点语法只是一个别名而已。

#15


C++对变参的更改可不只这一点点的。是有比较重大的更改的。

#16


个人理解:
int printf(const char * ,...):如没第二个形参,那这里的逗号是否要保留,这就存在歧义;
int printf(const char * ...):这样说明的是当有多个形参时,可在补充,但要不要逗号,按C标准执行;
所以,没有逗号我认为是较为合理的。

#17


引用 16 楼 qiuping_chi 的回复:
个人理解:
int printf(const char * ,...):如没第二个形参,那这里的逗号是否要保留,这就存在歧义;
int printf(const char * ...):这样说明的是当有多个形参时,可在补充,但要不要逗号,按C标准执行;
所以,没有逗号我认为是较为合理的。

意思都一样,Bjarne StroustrupS博士并无注释说明这种方便。

我认为是徒添一小混乱罢了。

#18


parameter-declaration-clause:
      parameter-declaration-list[opt] ...[opt]
      parameter-declaration-list , ...

C++里的确可以省去...前的逗号。

#19


呵呵,通假字

#20


该回复于2011-09-13 09:55:58被版主删除

#21


该回复于2011-09-13 09:48:32被版主删除

#22


特来接分 对C++之父的一个不解。

#23


不懂…… 

#24


可能是笔误,如果是译的,可能是译的问题

#25


之前也想过这个问题... 

#26


楼主, 其实, 我是来拿分得~

#27


该回复于2011-09-13 09:54:47被版主删除

#28


该回复于2011-09-13 09:47:09被版主删除

#29


逗号不是必须的--------只要理解这一点,就OK了。

#30


思想永远比文字重要!

#31


路过,说的是

#32


有逗号啊...

#33


要学楼主学习啊,看得好细

#34


就好像
名人写错字,叫通假字
非名人写错字,叫错别字

#35


LZ,要跟你学习

#36


ljljlj回答得不错。

#37


要用这种精神学习呀  

#38


其实我很想知道他的名字怎么读  问10个10都不会读、 对C++之父的一个不解。

#39


精社可嘉,但是不一定是作者的错哟。

#40


...是什么意思。好像以前在书里见过,是在想不起来了。有知道的给说一下。

#41


都是法国

#42


其实看到MSDN上的声明就已经很清楚了:
int printf( const char *format [, argument]... );

这个逗号只有在有第二个参数的时候才能要,如sprintf("abc");就不需要。

sprintf("abc%s","abc");就需要。

对了吧、、、、、

#43


引用 1 楼 mengmingtao 的回复:
不止没有逗号,连形参名也没有呀。呵呵


声明可以不加形参名

#44


该回复于2011-09-14 15:41:46被版主删除

#45


同意16楼的解释,我个人觉得C++的任何一点改变都是经过仔细推敲的,这里之所以不加逗号是因为逗号作为参数分割符,在函数参数列表处存在一个逗号必然会应该有两个参数的通常想法里(当然实际这个就是特例),如果上述声明如果有逗号是否就意味着参数不得少于两个,而没有逗号就是明确的这个函数可以只传一个参数。

#46


过来看看

#47


引用 42 楼 nlqlove 的回复:
其实看到MSDN上的声明就已经很清楚了:
int printf( const char *format [, argument]... );

这个逗号只有在有第二个参数的时候才能要,如sprintf("abc");就不需要。

sprintf("abc%s","abc");就需要。

对了吧、、、、、
对了

#48


名人写错字,叫通假字
非名人写错字,叫错别字

#49


这种事情,问编译器就好了。写个测试程序,编译通过就没问题,没通过要么是编译器不支持,要么就是书写/印错了。

#50


存在,必然有其理由.