Кажется, что стандартная практика программирования и стандарт 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 во время выполнения?