Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何避免使用常数作为文件名大小?_C++_Arrays_Vector_Posix - Fatal编程技术网

C++ 如何避免使用常数作为文件名大小?

C++ 如何避免使用常数作为文件名大小?,c++,arrays,vector,posix,C++,Arrays,Vector,Posix,看来标准编程实践和POSIX标准是不一致的。我正在使用一个程序,我注意到我看到了很多东西,比如: char buf[NAME_MAX + 1] 我还看到,很多操作系统没有定义NAME\u MAX,并且说它们在技术上不必根据POSIX进行定义,因为您应该使用pathconf在运行时获取其配置的值,而不是将其硬编码为常量 问题是编译器不允许我以这种方式对数组使用pathconf。即使我尝试将pathconf的结果存储在一个常量int中,它仍然会抛出一个fit并说它必须是一个常量。所以看起来为了实际

看来标准编程实践和POSIX标准是不一致的。我正在使用一个程序,我注意到我看到了很多东西,比如:

char buf[NAME_MAX + 1]
我还看到,很多操作系统没有定义
NAME\u MAX
,并且说它们在技术上不必根据POSIX进行定义,因为您应该使用pathconf在运行时获取其配置的值,而不是将其硬编码为常量

问题是编译器不允许我以这种方式对数组使用pathconf。即使我尝试将pathconf的结果存储在一个常量int中,它仍然会抛出一个fit并说它必须是一个常量。所以看起来为了实际使用pathconf,我必须避免在这里使用字符数组作为缓冲区,因为这显然不够好。因此,我被困在一个岩石和一个硬的地方,因为C++标准似乎不允许我做POSIX所说的我必须做的事情,那就是在运行时确定一个文件缓冲区的大小,而不是编译时间。 我能找到的关于这个的唯一信息表明我需要用一个向量替换数组,但不清楚我将如何做。当我使用一个简单的程序进行测试时,我可以让它工作:

std::vector<char> buf((pathconf("/", _PC_NAME_MAX) + 1));
std::vector buf((路径配置(“/”,_PC_NAME_MAX)+1);

然后我可以通过调用
buf.size()
或其他方法计算出大小。但我不确定这是否是正确的方法。是否有人有过尝试让程序停止的经验,这取决于系统头中定义的常量,如
NAME\u MAX
maxmanamlen
,并让实现在运行时使用pathconf?

中途措施确实会导致某种冲突

const usigned NAME_MAX = /* get the value at runtime */;
char buf[NAME_MAX + 1];
第二行声明了一个C样式数组(大概)用于保存一个C样式字符串。在C中,这很好。在C++中,存在一个问题,因为编译时不知道<代码> NAMEX MAX < /C> >的值。这就是为什么我把这个叫做中间度量,混合了C风格代码和C++编译。(有些编译器会允许C++中的。显然你的不。)

C++方法将使用C++风格字符串,如:

std::string buf;
就这样。不需要指定大小,因为内存将根据需要分配,前提是避免使用C风格的接口。合理时使用流式传输(
>
)。如果缓冲区是由用户或文件输入填充的,这应该是您所需要的全部


如果您需要使用C样式的字符串(可能这个缓冲区是由为C编写的系统调用填充的?),那么有几个选项可以分配所需的空间。最简单的可能是一个向量,就像你想的那样

std::vector<char> buf{NAME_MAX + 1};
system_call(buf.data()); // Send a char* to the system call.

还有一个智能指针选项,但是
vector
方法可能会更好地处理为C样式数组编写的现有代码。

std::string
非常有用。我不熟悉POSIX或pathconf,但通常,如果我无法确定编译时需要的内存量,我会使用动态内存分配(例如malloc或new)为我的字符数组分配内存。这样,您就不必指定常量。
std::string buf{NAME_MAX + 1, '\0'};
system_call(buf.data()); // Send a char* to the system call.