c++ MinGW g++'strnlen'未在此范围中声明

qnzebej0  于 2023-01-06  发布在  其他
关注(0)|答案(5)|浏览(226)

目前我正在尝试运行从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前面。在这方面的任何帮助都将不胜感激

k5ifujac

k5ifujac1#

strnlen不是一个标准的C++函数,我猜你以前用过其他编译器,它们提供了这个函数作为一个非标准的扩展。
您将需要更改代码,以便不调用此函数;或者为您自己的函数提供类似的功能(不要将其称为strnlen)。

6mw9ycah

6mw9ycah2#

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

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;
}
zphenhs4

zphenhs43#

strlen的正确标头为:

#include <string.h>

参考:strnlen

dm7nw8vv

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

# Unique Pointer Makefile
CXX      = g++
CXXFLAGS = -O3 -funroll-loops -ftree-vectorize -Wall -std=gnu++17 
TARGET   = uni
OBJS     = strc.o unique.o

%.o: %.cpp
    $(CXX) $(CXXFLAGS) -c $<

$(TARGET): $(OBJS)
    $(CXX) -o $@ $(OBJS)

.PHONY: clean
clean:
    rm -f $(TARGET) *.o
5us2dqdw

5us2dqdw5#

您可以使用以下代码片段替换strnlen
strlen (s) < maxlen ? strlen (s) : maxlen
您可以参考strnlen

相关问题