void function()和void function(void)一样吗?

时间:2008-07-24 16:54:21   来源:论坛整理  作者:  编辑:chinaitzhe
我怎么一直觉得他们一样呢?
好多年写C 代码都是用void function();代表无参数
我最近在写C时发现,似乎void function();是指任意参数,而只有
void function(void);才是真正的无参数。

是这样的吗?
还是C和C 有区别?
C是怎么样的?C 是怎么样的?
网友回复:
C/C code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/





void function();



void function(void);



//一样吧,小菜飘过


网友回复:一样,一样的。
网友回复:一样的,

写代码的习惯而已...
网友回复:C 中 void function() == void function( ... )
Cpp 中 一样 ...
网友回复:
引用 4 楼 mLee79 的回复:
C 中 void function() == void function( ... )
Cpp 中 一样 ...


我试了还真不一样,至少在C里

各位可以试一下,VC6中:

测试一:
C/C code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/



void function();



int main()

{

    int i = 5;



    function(i);



    return 0;

}



#include <stdio.h>



void function(int i)

{

    printf("%d\n", i);

}



结果打印出5

测试二:
C/C code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/



void function(void);



int main()

{

    int i = 5;



    function(i);



    return 0;

}



#include <stdio.h>



void function(int i)

{

    printf("%d\n", i);

}



编译器报告两个警告
--------------------Configuration: Anything - Win32 Debug--------------------
Compiling...
main.c
E:\Code\Cpp\Application Manage\MultiAgentTest\UnitTest\Anything\main.c(7) : warning C4087: 'function' : declared with 'void' parameter list
E:\Code\Cpp\Application Manage\MultiAgentTest\UnitTest\Anything\main.c(15) : warning C4027: function declared without formal parameter list
Linking...

Anything.exe - 0 error(s), 2 warning(s)

但硬去执行的话,也没问题。这可能跟_cdecl的调用规则有关,换了__stdcall之后就不让编译了

--------------------Configuration: Anything - Win32 Debug--------------------
Compiling...
main.c
E:\Code\Cpp\Application Manage\MultiAgentTest\UnitTest\Anything\main.c(7) : warning C4087: 'function' : declared with 'void' parameter list
E:\Code\Cpp\Application Manage\MultiAgentTest\UnitTest\Anything\main.c(15) : error C2709: 'function' : formal parameters length in bytes differs from previous declaration
E:\Code\Cpp\Application Manage\MultiAgentTest\UnitTest\Anything\main.c(1) : see declaration of 'function'
E:\Code\Cpp\Application Manage\MultiAgentTest\UnitTest\Anything\main.c(15) : warning C4027: function declared without formal parameter list
Error executing cl.exe.

Anything.exe - 1 error(s), 2 warning(s)
网友回复:
C/C code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/



void function(void);



int main()

{

    int i = 5;



    function();



    return 0;

}



#include <stdio.h>



void function(int i)

{

    printf("%d\n", i);

}



这样也能顺利执行,那个i也不知道函数从拿取的,反正是取到了,而且程序运行正常,也不报个“堆栈被破坏”什么的。
真是汗。
网友回复:K&R中一直都这样,函数声明都不写参数列表的,貌似要害字void都没有, 有啥好稀奇的...
ANSI中不推荐但兼容...


网友回复:
引用 7 楼 mLee79 的回复:
K&R中一直都这样,函数声明都不写参数列表的,貌似要害字void都没有, 有啥好稀奇的...
ANSI中不推荐但兼容...


我觉得很稀奇,因为我都不知道K&R是什么,大师解答一下?
网友回复:Kxx和Rxx,是远古c神话故事中的2个半神,因为远古时代生产力低下,他们也没有弄明白到底函数声明怎么写,所以就遗留下了一个错误用法。又因为“神谕”都是对的的原因,标准一直兼容了这个错误
网友回复:不一样!在C中,void function() 代表参数未定.void function(void) 代表该方法无参数
在C 中,2者一样的含义.

网友回复:declare 的时候编译器 仅关注函数名,而不关注参数
网友回复:
Kxx和Rxx,是远古c神话故事中的2个半神,因为远古时代生产力低下,他们也没有弄明白到底函数声明怎么写,所以就遗留下了一个错误用法。又因为“神谕”都是对的的原因,标准一直兼容了这个错误
再见神一般的人物
9楼高人啊~~~~~~~~~~~
再请问下, 论坛引用别人的话是杂搞的, 不懂
在回复这没看到选择, 每次这样
{0}{1}

引用{0}
太累

网友回复:
引用 9 楼 Icicly_qcmos 的回复:
Kxx和Rxx,是远古c神话故事中的2个半神,因为远古时代生产力低下,他们也没有弄明白到底函数声明怎么写,所以就遗留下了一个错误用法。又因为“神谕”都是对的的原因,标准一直兼容了这个错误


说实话还是不懂。
网友回复:我们说了不算~都是编译器的事情~
网友回复:假如没记错的话C里面不一样,应该是被兼容的一个错误。
C 里面就一样了,有明确的定义。
关键字:void,function,void,function,void,

相关文章

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面