2015-10-25 13 views
7

Na this page, Microsoft oświadcza, że ​​POSIX mkdir jest nieaktualny na rzecz "ISO C++ Conformant" _mkdir. To samo wydaje się dotyczyć innych podobnych funkcji POSIX.Win32 mkdir kontra _mkdir

Czy mają na myśli, że są przestarzałe w takim stopniu, w jakim są zainteresowane, czy też istnieją pewne standardy (POSIX, ISO?), Które zostały uznane za przestarzałe?

Pod jakim względem jest bardziej zgodny z ISO C++, a wobec którego standard ISO jest bardziej zgodny?

Niestety nie mam dostępu do aktualnych standardów ISO C++, chociaż przyjrzałem się ostatniej swobodnie dostępnej wersji roboczej dla C++ 11 (N3337) i nie wspomniałem o tych funkcjach, które mogłem zobaczyć.

Moim powodem do zadawania pytań jest to, że często nazywam te funkcje POSIX, jednak wolałbym nie pisać kodu przeciw przestarzałym standardom.

+0

odpowiedź w tym wątku może pomóc: http://stackoverflow.com/questions/814975/getch -jest-zdeklarowany – object

+0

czy patrzyłeś na to: ISO/IEC 14882: 2011 (E)? – HDJEMAI

+5

'mkdir' nie jest częścią standardu ISO, a zgodnie ze standardem ISO wszystkie niestandardowe funkcje zapewniane przez bibliotekę środowiska wykonawczego mają zaczynać się od podkreślenia. W związku z tym Microsoft dodał podkreślenie do wszystkich funkcji podobnych do POSIX (i innych niestandardowych funkcji) w bibliotece środowiska wykonawczego. Naprawdę nie ma w tym nic ważniejszego - tylko stare nazwy funkcji są przestarzałe, a nie same funkcje i dotyczy tylko Visual Studio, a nie POSIX. –

Odpowiedz

5

Tylko stara nazwa jest nieaktualna, a nie funkcja i tylko w Visual Studio, a nie w POSIX.

Zasadniczo powodem jest to, że mkdir nie jest zdefiniowana jako funkcja biblioteki uruchomieniowej w standardzie ISO C++, a niestandardowe funkcje biblioteki wykonawczej powinny zaczynać się od podkreślenia. W związku z tym Microsoft dodał podkreślenie do wszystkich niestandardowych nazw funkcji w bibliotece środowiska wykonawczego. Większość z nich jest funkcjami podobnymi do POSIX-owych, chociaż jest kilka specyficznych dla Windows.

Odcinek standardem, który określa identyfikatory, które są zarezerwowane do użytku przez wdrożenie jest 2.10, pkt 3. O ile mi wiadomo, średnia nie wyraźnie państwo, że realizacja nie może korzystać z innych identyfikatorów, ale przypuszczalnie wynika to z faktu, że taka implementacja nie byłaby w stanie zbudować legalnego programu w C++, który używa tej samej nazwy w niekompatybilny sposób.

W tym konkretnym przypadku, to jest prawda, jeśli program zawiera odpowiednie nagłówki wdrożenia zdefiniowane, więc nie jestem przekonany, że ISO C++ faktycznie wymagają Visual Studio potępiać starych nazw, ale wydaje się, że Microsoft albo uważał, że tak, albo że używanie zastrzeżonych identyfikatorów jest najlepszą praktyką. (Albo, że jest w stanie skompilować źródła POSIX jak jest powinno się zniechęcać; wybierać!)

Dodatkowa uwaga: Chciałbym założyć, że jest to również możliwe, aby konflikt nazewnictwa powodować problemy podczas linkami do bardziej skomplikowana programów, nawet jeśli nagłówki zdefiniowane w ramach implementacji nie są uwzględnione. Nie jest jednak jasne, czy usunięcie funkcji rzeczywiście pomaga w tym przypadku, ponieważ stare nazwy są nadal obecne w bibliotece. (Są one jednak w innym pliku .lib, a być może, że poprawia sprawy jakoś.)

You can download the November 2014 working draft of the current ISO C++ standard here.