繁体   English   中英

如何避免使用常量作为文件名大小?

[英]How do I avoid using a constant for filename size?

似乎标准编程实践和 POSIX 标准相互矛盾。 我正在使用一个程序,我注意到我看到了很多类似的东西:

char buf[NAME_MAX + 1]

而且我还看到很多操作系统没有定义NAME_MAX并说他们在技术上不必根据 POSIX 因为你应该使用 pathconf 来获取它在运行时配置的值而不是无论如何,将其硬编码为常数。

问题是编译器不允许我以这种方式将 pathconf 与 arrays 一起使用。 即使我尝试将 pathconf 的结果存储在一个 const int 中,它仍然会抛出一个合适的结果并说它必须是一个常量。 所以看起来为了实际使用pathconf,我必须避免在这里使用一个字符数组作为缓冲区,因为这显然不够好。 所以我陷入了困境,因为 C++ 标准似乎不允许我做 POSIX 说我必须做的事情,即在运行时而不是编译时确定文件名的字符缓冲区的大小.

我能找到的唯一信息表明我需要用向量替换数组,但不清楚我将如何做到这一点。 当我使用一个简单的程序进行测试时,我可以让它工作:

std::vector<char> buf((pathconf("/", _PC_NAME_MAX) + 1));

然后我可以通过调用buf.size()或其他东西来计算大小。 但我不确定这是否是正确的方法。 有没有人有任何经验试图让程序停止取决于系统头文件中定义的NAME_MAXMAXNAMLEN等常量,并让实现在运行时使用 pathconf 代替?

半途而废的措施确实往往会导致某种冲突。

const usigned NAME_MAX = /* get the value at runtime */;
char buf[NAME_MAX + 1];

第二行声明了一个 C 风格的数组(大概),用于保存一个 C 风格的字符串。 在 C 中,这很好。 在 C++ 中,存在一个问题,因为NAME_MAX的值在编译时是未知的。 这就是为什么我将其称为中途测量——混合了 C 风格的代码和 C++ 编译。 (一些编译器会在 C++ 中允许这样做。显然你的不允许。)

C++ 方法将使用 C++ 风格的字符串,如下所示:

std::string buf;

而已。 不需要指定大小,因为 memory 将根据需要分配,前提是您避免使用 C 样式接口。 在合理的情况下使用流式传输 ( >> )。 如果缓冲区由用户或文件输入填充,这应该是您所需要的。


如果您需要使用 C 风格的字符串(也许这个缓冲区正在被为 C 编写的系统调用填充?),有一些用于分配所需空间的选项。 最简单的可能是一个向量,就像你想的一样。

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

或者,您可以使用 C++ 样式的字符串,这样可以更方便地操作数据。

std::string buf{NAME_MAX + 1, '\0'};
system_call(buf.data()); // Send a char* to the system call.

还有一个智能指针选项,但vector方法可能更适合为 C 样式数组编写的现有代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM