【发布时间】:2019-10-05 16:39:33
【问题描述】:
似乎标准编程实践和 POSIX 标准相互矛盾。我正在使用一个程序,我注意到我看到了很多类似的东西:
char buf[NAME_MAX + 1]
而且我还看到很多操作系统没有定义 NAME_MAX 并说它们在技术上不必根据 POSIX 来定义,因为您应该使用 pathconf 来获取它配置的值在运行时而不是将其硬编码为常量。
问题是编译器不允许我以这种方式对数组使用 pathconf。即使我尝试将 pathconf 的结果存储在一个 const int 中,它仍然会抛出一个合适的结果并说它必须是一个常量。所以看起来为了实际使用pathconf,我必须避免在这里使用一个字符数组作为缓冲区,因为这显然不够好。所以我陷入了困境,因为 C++ 标准似乎不允许我做 POSIX 说我必须做的事情,即在运行时而不是编译时确定文件名的字符缓冲区的大小.
我能找到的唯一信息表明我需要用向量替换数组,但不清楚我会怎么做。当我使用一个简单的程序进行测试时,我可以让它工作:
std::vector<char> buf((pathconf("/", _PC_NAME_MAX) + 1));
然后我可以通过调用buf.size() 或其他方式来计算大小。但我不确定这是否是正确的方法。有没有人有任何尝试让程序停止取决于系统头文件中定义的 NAME_MAX 或 MAXNAMLEN 等常量并让实现在运行时使用 pathconf 的经验?
【问题讨论】:
-
std::string很有用。 -
我不熟悉 POSIX 或 pathconf,但一般来说,如果我无法在编译时确定我需要的内存量,我会使用动态内存分配(例如 malloc 或 new)来分配我的 char 数组的内存。这样,您不必指定常量。