This works:
#include <iostream>
using namespace std;
but this fails:
#include <stdio>
When is .h
not needed?
About the namespace issue,I didn't find such logic in cstdio
:
#pragma once
#ifndef _CSTDIO_
#define _CSTDIO_
#include <yvals.h>
#ifdef _STD_USING
#undef _STD_USING
#include <stdio.h>
#define _STD_USING
#else /* _STD_USING */
#include <stdio.h>
#endif /* _STD_USING */
// undef common macro overrides
#undef clearerr
#undef feof
#undef ferror
#undef getc
#undef getchar
#undef putc
#undef putchar
#define _HAS_CONVENTIONAL_CLIB 1
#define _IOBASE _base
#define _IOPTR _ptr
#define _IOCNT _cnt
#ifndef _FPOSOFF
#define _FPOSOFF(fp) ((long)(fp))
#endif /* _FPOSOFF */
typedef FILE _Filet;
#ifndef RC_INVOKED
#if _GLOBAL_USING
_STD_BEGIN
using ::_Filet;
using ::size_t; using ::fpos_t; using ::FILE;
using ::clearerr; using ::fclose; using ::feof;
using ::ferror; using ::fflush; using ::fgetc;
using ::fgetpos; using ::fgets; using ::fopen;
using ::fprintf; using ::fputc; using ::fputs;
using ::fread; using ::freopen; using ::fscanf;
using ::fseek; using ::fsetpos; using ::ftell;
using ::fwrite; using ::getc; using ::getchar;
using ::gets; using ::perror;
using ::putc; using ::putchar;
using ::printf; using ::puts; using ::remove;
using ::rename; using ::rewind; using ::scanf;
using ::setbuf; using ::setvbuf; using ::sprintf;
using ::sscanf; using ::tmpfile; using ::tmpnam;
using ::ungetc; using ::vfprintf; using ::vprintf;
using ::vsprintf;
_STD_END
#endif /* _GLOBAL_USING */
#endif /* RC_INVOKED */
#endif /* _CSTDIO_ */
Standard C++ headers don't use the .h. Everything else does (or, more accurately, everything else uses whatever extension it wants, .h, .hxx, .hpp, .hh and more).
Standard C headers can be included in one of two ways:
The second form wraps its symbols in the
std
namespace.The original intent was that headers could, in principle, be stored in a database in some highly optimised pre-compiled state, in which case the idea of a file extension wouldn't make sense. I don't know that this ever happened in practice.
the .h is not needed, simply when the .h is omitted from the file's name in the filesystem.
It's not needed for the header files defined by the C++ Standard, none of which have a .h extension. The C++ version of
stdio.h
is:which wraps
stdio.h
, placing the names in it in the C++std
namespace, but you can still use all the C Standard header files in C++ code, if you wish.Edit: The macro that places the names in the std namespace in the GCC version of cstdio is:
You can check that your own header does what it should do by trying to use something like:
in your code.