编译 C++ 文件失败,因为找不到"ssize_t"的定义

compile c++ file failed because can not find the definition of `ssize_t`

本文关键字:quot ssize 定义 C++ 文件 因为 找不到 编译 失败      更新时间:2023-10-16

我有一个 c++ 头文件和一个 c++ 源文件socket_client.hsocket_client.cc。在socket_client.h中,我有这样的代码示例:

#include <limits.h>
#include <string>
ssize_t Send(const void *msg, const size_t msg_size/*send msg size*/);
...

socket_client.cc中,我有这样的代码片段:

#include "somewhere/socket_client.h"
#include <sys/types.h>
...

当我用 gcc 4.8 编译时,编译器会说"错误"并抱怨找不到ssize_t的定义;但是,当我在socket_client.h中添加#include <sys/types.h>时,它将编译成功。 还有其他人成功编译它,而无需使用 gcc 4.4 添加#include <sys/types.h>

我对此完全感到困惑。是否有必要添加该行?处理此问题的收集方法是什么?

ps:我使用一个名为blade的工具进行编译,该工具基于scons(gcc 4.4也是如此)。

答案很简单,看看你的包含顺序。在包含types.h之前,先包括socket_client.h。这会导致您的错误。只需更改顺序,一切都应该没问题。

GCC 4.8 从 2013 年开始真的很旧(4.4 完全过时了),不再真正支持了。你应该升级你的GCC编译器,至少升级到GCC 6,如果可能的话升级到GCC 7(在2018年春季,这将是GCC 8)。

(通过努力,你可以从它的源代码编译和安装GCC 7;而且你并不总是需要root访问权限)

您需要定义要编码C++标准。我强烈建议至少使用 C++11编码,如果可能的话,C++14 编码。几个月后(例如.mid 2018年),C++17可能会很方便。C++11 确实与它的前身不同(所以甚至不值得为旧标准编码,除非你被迫这样做)。

如果您为 C++11 编写代码,您希望至少使用 std::size_t(而不是旧的 C 特定size_t)来自<cstddef><cstdlib>等 - 并且该标准标头应包含在您的标头之前(或内部),例如"somewhere/socket_client.h";对于最近的g++,您应该使用g++ -std=c++11 -Wall -Wextra -g进行编译(以获取 C++11、所有警告和调试信息)。当然,如果您想要C++14,请使用-std=c++14....

C++是一种非常困难的编程语言;如果你(像我们大多数人一样,包括我)仍在学习它,请务必通过一些好的C++编程书籍学习至少C++11(或C++14)。

还可以查看一些好的C++参考网站(甚至是适当的C++标准文档)。

顺便说一句,您可以从与网络相关的C++中找到许多可用的库。如果你想开发或使用一些带有HTTP、POCO、Qt、Boost或0mq的Web API(还有许多其他库),可以考虑libcurl(客户端)和libonion(服务器端)。

大多数版本的 GCC(甚至是非常旧的版本)都支持-H-M预处理器选项。您可以使用它们(至少可以了解包含哪些系统标头)。