Почему является getcwd () не совместимым C++ ISO?

Вы можете использовать функцию usort() , например

$arr = array('......'); // your array
usort($arr, "my_reverse_array");

function my_reverse_array($a, $b) {
    if($a['roi'] == $b['roi'])
    {
        return 0;
    }
    return ($a['roi'] < $b['roi']) ? -1 : 1;
}

. Это гарантирует, что элемент с самым высоким roi будет первым в массиве.

16
задан Tom 15 March 2009 в 15:59
поделиться

7 ответов

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

19
ответ дан 30 November 2019 в 15:21
поделиться

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

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

a) определенные реализацией в пользу программиста (такие как printf)
b) зарезервированные программисту (такие как нечто)
c) зарезервированные к реализации (такие как _unlink)

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

В данном случае, Posix предоставляет список категории (a) имена (те, которые удаляют связь), что Вы должны быть определены, когда и только при включении определенных заголовков. Так как Стандарт 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 не имеет той возможности.

24
ответ дан 30 November 2019 в 15:21
поделиться

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

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

4
ответ дан 30 November 2019 в 15:21
поделиться

Прибавлять к сообщению Dan Olson: См. страница ANSI C Compliance на MSDN

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

3
ответ дан 30 November 2019 в 15:21
поделиться

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

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

3
ответ дан 30 November 2019 в 15:21
поделиться

For the record, getcwd() wasn't deprecated by ISO. It was "deprecated" by Microsoft. Microsoft rewrote many C functions -- often with a little better security in mind (say, string functions that also take a max_length parameter). They then had their compiler spit out these warnings, which I consider bogus because no standards group deprecated any of the functions declared deprecated.

3
ответ дан 30 November 2019 в 15:21
поделиться

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

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

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

3
ответ дан 30 November 2019 в 15:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: