未在此范围内声明 MinGW g++ `strnlen`

MinGW g++ `strnlen` was not declared in this scope

目前我正在尝试 运行 我从 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");
}
...

编译这个我是 运行ning:

g++ -c strc.cpp -o strc.o -std=c++11

我试过用 string.h 替换 cstring,我什至试过但是 std::strnlen 前面。在此问题上的任何帮助将不胜感激

strnlen 不是标准 C++ 函数。我猜您以前一直在使用其他一些编译器,这些编译器将此作为非标准扩展提供。

您需要更改代码以不调用此函数;或提供您自己的具有类似功能的函数(不调用它 strnlen)。

strlen 的正确 header 是:

#include <string.h>

参考:strnlen

您可以通过以下代码片段
替换 strnlen strlen (s) < maxlen ? strlen (s) : maxlen

你可以参考strnlen

我有类似的问题...我把这个函数放在那里

static size_t strnlen(const char* s,size_t maxlen) {
    for (size_t i=0; i < maxlen ; i++ ){
        if (s[i] == '[=10=]')
            return i;
    }
    return maxlen;
}