我正在使用WSA编写tcp/ip服务器。在一些故障排除之后,我的一个朋友建议我使用bool __cdecl winsock_server ( void )
而不是bool winsock_server()
。
但他没有解释__cdecl
和(void)
的含义。我已经知道__cdecl
改变了参数放置在汇编级别堆栈上的方式,但是(void)
是什么意思?
我应该指出我是C++新手。我之前只用过C#和VB.NET。
提前感谢!
__cdecl
你说得对,它强制将函数调用约定转换为C风格,因此影响了函数的调用方式(如何传递参数和谁清理堆栈)。顺便说一下,这已经是默认的调用约定了。
(void)
与()
在C++
中它们是等效的(无参数)。
在C
中,前者表示没有参数,后者表示任意数量的参数。因此,当您重复使用头文件以供C
使用时可能会导致问题。
__cdecl
是 C 调用约定。C 和 C++ 符号(函数和变量名)都可以使用它。extern C
是 C++ 的一种语法,建议 C++ 编译器不要以 C++ 方式进行名称重整。 (C 方式只是在函数名前加一个下划线,这已足够,因为不支持函数重载)。根据需要,C++ 声明可以使用其中的一个或两个或没有。 - Gyapti Jain(void) 表示它没有参数。这更多是一种代码风格的问题。你可以只使用 (),但显式地写出 (void) 可以表明函数没有参数。
__cdecl
已经是自由函数的默认调用约定,在C++成员函数中为__thiscall
,不能为__cdecl
。不要将其与像受欢迎的答案所做的extern "C"
混淆。(void)
只在C语言中有用,强调该函数没有参数。 - Hans Passant