编译 C++ 文件失败,因为找不到"ssize_t"的定义
compile c++ file failed because can not find the definition of `ssize_t`
我有一个 c++ 头文件和一个 c++ 源文件socket_client.h
socket_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
预处理器选项。您可以使用它们(至少可以了解包含哪些系统标头)。
- 'char (*RtlpNumberOf(T (&)[N]))[N]':无法从"char *"
- Arduino IDE 错误 - 无法找到数字文字运算符"运算符""f900ff"
- "inline"、"constexpr"或"noexcept"
- "非静态数据成员之前需要构造函数" - 我是否使用"boost::variant"
- 我必须安装"libbitcoin-server"才能包含"bitcoin.hpp"
- 为什么 std::ssize 被强制为其有符号大小类型的最小大小
- “并非所有控制路径都返回一个值./&quot“控制可能达到非空隙功能的末端”.验证时循环时
- 如何输出a'&quot在不使用线端的情况下进行文件
- 断言失败 (!ssize.empty()) in remapBilinear.
- 删除“按任何键” ..&quot.从VS C 控制台应用程序
- 如何检测我何时向可变参数函数传递"std::string"而不是"c_str()"
- '&lt;'''&lt;'''&quot的模板类错误''令牌”
- 错误消息:"jj"的名称查找已更改为ISO"for"范围,(如果您使用"