[C++] POSIX fileno vs ISO _fileno

Pagina: 1
Acties:
  • 113 views sinds 30-01-2008
  • Reageer

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Ik gebruik de volgende code:
C++:
1
2
3
FILE* f;
struct stat b;
fstat(fileno(f), &b);

VC8 zegt hierover:
warning C4996: 'fileno' was declared deprecated
c:\program files\microsoft visual studio 8\vc\include\stdio.h(688) : see declaration of 'fileno'
Message: 'The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _fileno. See online help for details.'
g++ 4.0 lijkt _fileno echter niet te kennen. Is er een andere functie die ik zou moeten gebruiken of is g++ nog niet up-to-date?

[ Voor 10% gewijzigd door Olaf van der Spek op 26-02-2006 20:19 ]


Verwijderd

Komt door de nieuwe "veilige" CRT van MS. De "nieuwe" functies (met underscore) schijnen platform-afhankelijk te zijn, maar hang me daar niet aan op want dat weet ik niet zeker (het het alleen ergens gelezen) :)

Je kan de waarschuwingen neermeppen door het volgende te definieren in de eigenschappen van je project (of in een precompiled header):
code:
1
2
_CRT_SECURE_NO_DEPRECATE
_CRT_NONSTDC_NO_DEPRECATE

[ Voor 3% gewijzigd door Verwijderd op 26-02-2006 21:58 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:17

.oisyn

Moderator Devschuur®

Demotivational Speaker

(jarig!)
fileno is gewoon geen ISO C++, daarom begint hij in MSVC++ met een underscore, zodat je geen compile errors krijgt als je zelf een identifier met de naam 'fileno' definieert.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
.oisyn schreef op zondag 26 februari 2006 @ 22:04:
fileno is gewoon geen ISO C++, daarom begint hij in MSVC++ met een underscore, zodat je geen compile errors krijgt als je zelf een identifier met de naam 'fileno' definieert.
Dat snap ik, maar hoe zit het met g++?

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 27-03 16:52
Het hele idee van _fileno is nou juist dat je weet dat het niet in andere compilers zit.

Kijk eens naar boost::filesystem, dat verbergt die complexiteit.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
MSalters schreef op zondag 26 februari 2006 @ 22:44:
Het hele idee van _fileno is nou juist dat je weet dat het niet in andere compilers zit.
Eh, is geen enkele andere compiler vendor van plan ISO C++ te implementeren?
Nog zo'n handige standaard. :)
Kijk eens naar boost::filesystem, dat verbergt die complexiteit.
Bedankt voor de tip.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15:57
Hij zit juist niet in ISO C++; conformerende compilers hoeven 'm dus niet te hebben.

Verder zit 'ie wel in ISO C90 voor zover ik weet, dus met een beetje mazzel komt 'ie ook in C++ 'binnenkort'. (En hopelijk komen ze dan ook met een versie voor iostreams.)

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Soultaker schreef op zondag 26 februari 2006 @ 23:09:
Hij zit juist niet in ISO C++; conformerende compilers hoeven 'm dus niet te hebben.
Dus met "Instead, use the ISO C++ conformant name: _fileno." wordt eigenlijk alleen de underscore bedoeld en niet het symbool zelf?

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
MSalters schreef op zondag 26 februari 2006 @ 22:44:
Kijk eens naar boost::filesystem, dat verbergt die complexiteit.
Ik wil de size van een open file (handle) hebben, kan dat daarmee?
Volgens mij werkt boost::filesystem niet met open handles.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:17

.oisyn

Moderator Devschuur®

Demotivational Speaker

(jarig!)
Soultaker schreef op zondag 26 februari 2006 @ 23:09:
Verder zit 'ie wel in ISO C90 voor zover ik weet,
C99 bedoel je? In C90 zit ie iig zeker niet.
OlafvdSpek schreef op zondag 26 februari 2006 @ 23:12:
[...]

Dus met "Instead, use the ISO C++ conformant name: _fileno." wordt eigenlijk alleen de underscore bedoeld en niet het symbool zelf?
Ja, hij moet een underscore hebben om te conformen met de standaard. Hij wordt namelijk geintroduceerd door stdio.h, en dat is een standaard header waarvoor precies gedefinieerd is welke identifiers hij allemaal declareert. Een implementatie mag dus eigenlijk niet zelf zomaar identifiers introduceren die niet met een underscore beginnen, omdat dat wellicht clasht met de identifiers in je eigen code.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
.oisyn schreef op maandag 27 februari 2006 @ 03:03:
Ja, hij moet een underscore hebben om te conformen met de standaard. Hij wordt namelijk geintroduceerd door stdio.h, en dat is een standaard header waarvoor precies gedefinieerd is welke identifiers hij allemaal declareert. Een implementatie mag dus eigenlijk niet zelf zomaar identifiers introduceren die niet met een underscore beginnen, omdat dat wellicht clasht met de identifiers in je eigen code.
Ah, op die manier. Die foutmelding is ook wel lekker duidelijk. :(
Maar zolang gcc niet ook _fileno gebruikt ga ik dus geen _fileno gebruiken.
Pagina: 1