目前我正在尝试运行从www.example.com收到的一些代码lynda.com但是它弹出了一个错误。我正在尝试编译的文件如下所示,只包括对strnlen
(strc.cpp)的调用:
#include <cstdio>
#include <cstring>
#include <memory>
#include "strc.h"
...
strc::strc() : data(nullptr) {
msg("default ctor");
}
strc::strc(const char * s) {
size_t slen = strnlen(s, _maxlen);
data = new char[slen + 1];
data[slen] = 0;
memcpy(data, s, slen);
msg("cstring ctor");
}
strc::strc(const strc & f) {
size_t slen = strnlen(f.data, _maxlen);
data = new char[slen + 1];
data[slen] = 0;
memcpy(data, f.data, slen);
msg("copy ctor");
}
...
为了编译这个,我运行:g++ -c strc.cpp -o strc.o -std=c++11
我试过将cstring
替换为string.h
,甚至尝试过将std::
放在strnlen
前面。在这方面的任何帮助都将不胜感激
5条答案
按热度按时间k5ifujac1#
strnlen
不是一个标准的C++函数,我猜你以前用过其他编译器,它们提供了这个函数作为一个非标准的扩展。您将需要更改代码,以便不调用此函数;或者为您自己的函数提供类似的功能(不要将其称为
strnlen
)。6mw9ycah2#
我有一个类似的问题...我把这个函数放在那里
zphenhs43#
strlen的正确标头为:
参考:strnlen
dm7nw8vv4#
我认为编译器错误是由于命令行标志
-std=c++11
而发生的。根据cplusplus参考,C++版本的头文件<cstring>
似乎只有以下相关函数:根据该Microsoft参考,在头部<string.h>
的C版本中定义的函数strnlen
可能比strlen
更安全,因为它“计算长度,但是如果字符串未终止,则不经过缓冲区的末尾”。当我在GCC 11上运行该代码时,当我将命令行标志更改为-std=gnu++14
时,编译成功(或稍后,甚至去掉了标志),它启用了包含<string.h>
的C版本的GNU扩展(您可以在GNU参考中阅读更多关于GNU C扩展的内容)我在尝试运行从www.example.com获得的一些代码时遇到了同样的问题lynda.com,因此您可能会发现下面的Makefile非常有用,我使用它成功地编译了一个文件unique.cpp
其包括报头strc.h
:5us2dqdw5#
您可以使用以下代码片段替换
strnlen
strlen (s) < maxlen ? strlen (s) : maxlen
您可以参考strnlen