【问题标题】:MinGW g++ `strnlen` was not declared in this scopeMinGW g++ `strnlen` 未在此范围内声明
【发布时间】:2016-02-04 09:26:47
【问题描述】:

目前我正在尝试运行我从 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 前面。非常感谢您对此事的任何帮助

【问题讨论】:

  • 能否请您提供我们的错误信息?是不是说 strnlen 没有在这个范围内声明?
  • 复制构造函数可以使用strlenstrcpy,因为ff 的构造过程中已经被限制在_maxlen 之下

标签: c++ c++11 mingw


【解决方案1】:

strnlen 不是标准 C++ 函数。我猜你之前一直在使用其他一些编译器,它提供了这个作为非标准扩展。

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

【讨论】:

  • 我已经用 MSVC 尝试过这段代码,它编译得很好,我只是假设它也应该在 g++ 中工作。这不是我自己的代码,正如我提到的,我是从 lynda.com 获得的,我会看看我能做些什么来修复它
  • strnlen的调用替换为strlen,编译运行正常
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    strlen 的正确标题是:

    #include <string.h>
    

    参考:strnlen

    【讨论】:

    • 问题是关于strnlen,而不是strlen
    • 另外,&lt;cstring&gt;提供了&lt;string.h&gt;的所有功能
    • @M.M 感谢您的亮点,我已经更正了我的答案。 ...只是错过了'n':)
    【解决方案4】:

    您可以通过以下代码的sn-p替换strnlen
    strlen (s) &lt; maxlen ? strlen (s) : maxlen

    您可以参考strnlen

    【讨论】:

    • 不是一个好主意。也许您使用 strnlen 是因为您不确定字符串是否以 null 结尾。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多