__cdecl和(void)的含义是什么?

3

我正在使用WSA编写tcp/ip服务器。在一些故障排除之后,我的一个朋友建议我使用bool __cdecl winsock_server ( void )而不是bool winsock_server()

但他没有解释__cdecl(void)的含义。我已经知道__cdecl改变了参数放置在汇编级别堆栈上的方式,但是(void)是什么意思?

我应该指出我是C++新手。我之前只用过C#和VB.NET。

提前感谢!


3
他们没有做任何有用的事情。__cdecl已经是自由函数的默认调用约定,在C++成员函数中为__thiscall,不能为__cdecl。不要将其与像受欢迎的答案所做的extern "C"混淆。(void)只在C语言中有用,强调该函数没有参数。 - Hans Passant
2个回答

12

__cdecl
你说得对,它强制将函数调用约定转换为C风格,因此影响了函数的调用方式(如何传递参数和谁清理堆栈)。顺便说一下,这已经是默认的调用约定了。

(void)()
C++中它们是等效的(无参数)。 在C中,前者表示没有参数,后者表示任意数量的参数。因此,当您重复使用头文件以供C使用时可能会导致问题。


使用 __cdecl 时,我能获得哪些优势? - AcrimEx
@Th3Bamb00zl3r,是的,您可以与'C'兼容。关于性能,双方可能会有争议。(cdecl代表c声明) - Gyapti Jain
cdecl 不是 extern C,请参见 https://learn.microsoft.com/en-us/cpp/cpp/cdecl?view=vs-2019 - JVApen
@JVApen __cdecl 是 C 调用约定。C 和 C++ 符号(函数和变量名)都可以使用它。extern C 是 C++ 的一种语法,建议 C++ 编译器不要以 C++ 方式进行名称重整。 (C 方式只是在函数名前加一个下划线,这已足够,因为不支持函数重载)。根据需要,C++ 声明可以使用其中的一个或两个或没有。 - Gyapti Jain

0

(void) 表示它没有参数。这更多是一种代码风格的问题。你可以只使用 (),但显式地写出 (void) 可以表明函数没有参数。


()在C++中表示函数没有参数。 - melpomene
是的,但写上(void)更加明确。这是一种代码风格。编译器不会在意。 - Niek Nooijens
1
只有从C语言转过来的人才会认为这样更加明确。在其他所有语言中,空参数列表意味着一个空参数列表。我认为这不是C++的惯用法。 - melpomene
@Niek:是的,它会。 - Lightness Races in Orbit
@melpomene 这是因为我不知怎么地把你的评论读成了“用C”而不是“用C++”。 - Lightness Races in Orbit
这不仅仅是一种编码风格问题!编写 function(void) 意味着一个没有参数的函数(参数类型列表为 void),而 function() 可能 意味着一个具有多个参数的函数;其数量由初始化程序列表确定,而不是参数类型列表。我是从这里了解到的:https://jameshfisher.com/2016/11/27/c-k-and-r/ - Bert Regelink

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接