Почему getcwd () не соответствует ISO C ++? - PullRequest
16 голосов
/ 15 марта 2009

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

Ответы [ 7 ]

24 голосов
/ 15 марта 2009

Есть хорошая дискуссия об этом. P.J. Plauger ответы на это

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

a) те, которые определены реализацией в интересах программиста (например, printf)
b) те, что зарезервированы для программиста (например, foo)
c) те, которые зарезервированы для реализации (например, _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 не имеет такой возможности.

19 голосов
/ 15 марта 2009

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

4 голосов
/ 15 марта 2009

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

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

3 голосов
/ 28 января 2010

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

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

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

3 голосов
/ 07 июля 2009

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

3 голосов
/ 15 марта 2009

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

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

3 голосов
/ 15 марта 2009

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

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

...