c ++ - Hvad er \_sopen\_s () ækvivalent for funktionen open ()?

Indlæg af Hanne Mølgaard Plasc

Problem



Microsoft har udskrevet \_open til fordel for \_sopen\_s.
Hvad er de anbefalede tilsvarende argumenter?

Bedste reference


Nå kan jeg skrive mit pænt formaterede svar, så her er det:


Til


int fd = \_open(name,oflags);


Erstat med


int fd;
errno\_t errno = \_sopen\_s(&fd,name,oflags,\_SH\_DENYRW,0);


Grunden til, at jeg skrev denne Q &A, er, at den giver en vigtig smule ikke-indlysende information, som Microsoft ikke gav. Jeg er enig i, at \_sopen\_s er en dårlig erstatning for \_open. Jeg undersøgte kun dette emne, fordi jeg fik en fejl forårsaget af de forkerte argumenter, der leveres til \_sopen\_s. \_sopen\_s var kun i koden for at slippe af med compiler advarsler; det oprindelige \_open-opkald var fint.

Andre referencer 1


Den bedste anbefaling ignorerer alle Microsofts politisk motiverede deprecations. Deres 'sikre' funktioner giver ingen egentlige sikkerhedsfordele i forhold til korrekt brug af de eksisterende C eller POSIX-lignende funktioner, og hvis de anvendes forkert , de er lige så 'usikre' som de funktioner, de sigter mod at erstatte.

Andre referencer 2


På Windows foreslår jeg at bruge CreateFile medmindre der er en god grund til ikke at gøre det. På Linux 'åbne' kort til kernel funktion, i Windows - til bibliotek funktion, der bruger 'CreateFile' alligevel.
Ifølge portabilitet er denne funktion noget mere bærbar på Microsoft-platforme (Win32/64/CE). Og naturligvis ikke tilgængelig på * nix. [3]