Вопрос

Эта статья MSDN утверждает, что getcwd() устарел и вместо него следует использовать совместимый с ISO C++ _getcwd, что вызывает вопрос:что делает getcwd() несовместимым с ISO?

Это было полезно?

Решение

Функции, не указанные в стандарте, должны начинаться с префикса подчеркиванием, что указывает на то, что они являются расширениями, специфичными для поставщика, или соответствуют стандарту, отличному от ISO. Таким образом, «соответствие» здесь Microsoft должна была добавить подчеркивание к названию этой конкретной функции, поскольку она не является частью стандарта ISO.

Другие советы

Существует хорошая дискуссия Об этом. P.J. Plauger отвечает на этот вопрос

  

Я парень, который настаивал еще в 1983 году, что пространство   имена, доступные для программы на C, можно разбить на:

     

a) те, которые определены реализацией в интересах программиста (например, printf)
    b) зарезервированные для программиста (например, foo)
    в) зарезервированные для реализации (например, _unlink)

     

Уже тогда мы знали, что это «реализация». был слишком монолитным -   часто более одного источника предоставляют биты реализации -   но это было лучшее, что мы могли сделать в то время. Стандарт С ++   ввел пространства имен, чтобы помочь, но они достигли только   часть их заявленных целей. (Вот что происходит, когда ты   стандартизировать бумажного тигра.)

     

В данном конкретном случае Posix предоставляет список имен категорий (а)   (например, unlink), что вы должны быть определены, когда и только когда вы   включать определенные заголовки. Поскольку стандарт C украл его заголовки из   Unix, который является тем же источником, что и для Posix, некоторые из этих заголовков   исторически пересекаются. Тем не менее, предупреждения компилятора должны иметь   какой-то способ учета того, поддерживается ли среда   является "чистым" Стандартный C ++ (платоновский идеал) или смешанный C / C ++ / Posix   среда. Текущая попытка Microsoft помочь нам бедным   программисты не принимают это во внимание. Настаивает на лечении   отмените связь как имя категории (b), что является близоруким.

Ну, GCC не будет объявлять имена POSIX в строгом режиме C, по крайней мере (хотя это все еще делает в режиме C ++):

#include <stdio.h>

int main() {
    &fdopen;
    return 0;
}

Вывод с использованием -std = c99

test.c: In function 'main':
test.c:4: error: 'fdopen' undeclared (first use in this function)

Вам нужно будет четко указать, что вы работаете в смешанном C / Posix, используя макросы функциональных тестов или не проходя какой-либо конкретный стандарт. Затем по умолчанию будет gnu89 , что предполагает смешанную среду ( man feature_test_macros ). По-видимому, MSVC не имеет такой возможности.

Как уже отмечали другие, getcwd не включен в ISO C ++, но является частью POSIX / IEEE Std 1003.1.

Microsoft решила включить некоторые из наиболее часто используемых функций POSIX в свою стандартную библиотеку C (но добавьте к этим функциям знак подчеркивания, чтобы не поощрять их использование).

Чтобы добавить к сообщению Дэна Олсона: см. Соответствие стандарту ANSI C страница в MSDN

  

Имена специфичных для Microsoft функций и глобальных переменных начинаются с одного подчеркивания. Эти имена могут быть переопределены только локально, в рамках вашего кода. Например, когда вы включаете файлы заголовков времени выполнения Microsoft, вы все равно можете локально переопределить специфическую для Microsoft функцию с именем _open, объявив локальную переменную с тем же именем. Однако вы не можете использовать это имя для своей собственной глобальной функции или глобальной переменной.

Насколько мне известно, getcwd() никогда не был частью стандарта ISO C++._getcwd() определенно нет, поскольку стандартные имена не начинаются с подчеркивания.

Фактически, статья MSDN ссылается на справочную страницу, в которой говорится, что она объявлена ​​в Direct.h, который не является стандартным заголовочным файлом C++.Мне статья кажется фейком.

Для записи, getcwd () не считается устаревшим в ISO. Это было "устарело" Microsoft. Microsoft переписала многие функции C - часто с немного большей безопасностью (скажем, строковые функции, которые также принимают параметр max_length ). Затем их компилятор выдал эти предупреждения, которые я считаю фальшивыми, потому что ни одна группа стандартов не осуждала ни одну из функций, объявленных устаревшими.

Статья в MSDN несколько сбивает с толку из-за того, что обычный человек мог бы сделать вывод из простого прочтения (если они не читают ее очень внимательным юристом).

В статье MSDN говорится: getcwd () не соответствует стандарту ISO C ++. Чтобы соответствовать этому стандарту ISO C ++ для именования функций (что нарушает getcwd), Microsoft должным образом поместила _ в начало функции, поэтому та же самая функция становится _getcwd (). Это совместимый с ISO C ++ способ именования функции, потому что getcwd () и _getcwd () не являются стандартной функцией ISO C ++, но специфичны для Microsoft (поставщика) или для конкретной реализации.

В статье не указано, каким будет стандартный вызов C ++ ISO для получения рабочего каталога ... хотя это то, что люди обычно читают с первого взгляда.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top