使用c头文件时,是不是需要将“struct”放在c++中的struct实例前面?

Posted

技术标签:

【中文标题】使用c头文件时,是不是需要将“struct”放在c++中的struct实例前面?【英文标题】:Is it required to place "struct" in front of a struct instance in c++ when you use c header files?使用c头文件时,是否需要将“struct”放在c++中的struct实例前面? 【发布时间】:2019-07-23 18:02:46 【问题描述】:

我正在学习如何进行套接字编程,并尝试重新创建 c 程序的功能: https://beej.us/guide/bgnet/examples/showip.c

c++ 中(因为我更喜欢 c++ 和我打算使用的语言)并且它使用标题:

stdio.h 
string.h
sys/types.h
sys/socket.h
netdb.h
arpa/inet.h
netinet/in.h

在我的代码中,我将 stdio.h 替换为 iostream,并将 string.h 替换为 cstring

我基本上是在他的程序中逐行输入代码,一边阅读文档一边尝试理解每个函数和结构。我知道在 c++ 中不需要(如在 c 中)使用 struct 关键字在结构的实例之前,所以在他的代码中任何对结构的引用我只是省略了它.

在编译中,netinet/in.h 中的所有结构都是未定义的!经过一段时间的故障排除和各种错误后,我刚刚下载了他的程序源并确保它不是我的标准库的问题(Cygwin 有问题?)就像一个魅力,但我仍然想要 c++。

我将所有stdio 的内容更改为iostream,并使用g++ 而不是gcc 进行编译,它仍然有效!唯一不同的是 struct 在 addrinfo 和其他结构之前。

在c++中使用c头文件时,是否需要将struct放在struct实例前面?

【问题讨论】:

可以使用两行程序调查此问题:#include <netinet/in.h> 后跟包含struct 或不包含struct 的定义。 【参考方案1】:

“在 c++ 中是否需要将“struct”放在结构实例的前面?” - 在 general;不,那是C'ism。但确实存在例外。

【讨论】:

广义地说,这是不正确的。有时,您需要这样做。 @SergeyA 好的。是的,我知道。但这不是语言律师的问题,所以我不想深入了解何时可能存在与结构同名的函数(如stat)以及其他需要关键字的情况。 general 在 C++ 中不需要它。魔鬼在细节中,是的,我同意细节。【参考方案2】:

即使您在程序中使用了所有C 内容(标题),如果文件以.cpp 扩展名结尾,那么最终系统会将其识别为C++ 源。因此,如果您不需要将 struct 放在每个 struct 实例之前,只要您的源文件是 C++ 源文件,它就不会显示任何编译错误。

这意味着你的问题的答案是“否”。

编辑:正如@JesperJuhl 指出的那样,这并不总是正确的。在 AiX、VMS、Novell NetWare、DOS 系统上会出现异常。在这种情况下,您需要在每个实例之前使用 struct 关键字。

【讨论】:

“如果文件以 .cpp 扩展名结尾,它会被您的系统识别为 C++ 源代码” - 这是 非常 系统和编译器相关的,绝对不是 普遍正确。试试 AiX、VMS、Novell NetWare、DOS 和它们各自的系统编译器的大小。举个例子

以上是关于使用c头文件时,是不是需要将“struct”放在c++中的struct实例前面?的主要内容,如果未能解决你的问题,请参考以下文章

在 c++ 中访问 c​​-struct

何时将静态函数定义放在 C 的头文件中?

在c / c ++中包含struct和compilation

使用带有结构/数组的头文件的指针问题,导致多重定义错误(C)

C语言函数的声明是在哪个位置声明

c语言概述