Когда .h не нужно включать заголовочный файл? - PullRequest
3 голосов
/ 28 марта 2010

Это работает:

#include <iostream>
using namespace std;

но это не удалось:

#include <stdio>

Когда .h не нужен?

Что касается проблемы пространства имен, я не нашел такой логики в 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_ */

Ответы [ 3 ]

6 голосов
/ 28 марта 2010

Стандартные заголовки C ++ не используют .h. Все остальное делает (или, точнее, все остальное использует любое расширение, которое ему нужно, .h, .hxx, .hpp, .hh и другие).

Стандартные заголовки C могут быть включены одним из двух способов:

#include <stdio.h>
#include <cstdio>

Вторая форма переносит свои символы в пространство имен std.

Первоначально предполагалось, что заголовки, в принципе, могут храниться в базе данных в каком-то высоко оптимизированном предварительно скомпилированном состоянии, и в этом случае идея расширения файла не имеет смысла. Я не знаю, что это когда-либо происходило на практике.

5 голосов
/ 28 марта 2010

Он не нужен для заголовочных файлов, определенных стандартом C ++, ни один из которых не имеет расширения .h. C ++ версия stdio.h:

#include <cstdio>

, который переносит stdio.h, помещая в него имена в пространстве имен C ++ std, но вы все равно можете использовать все заголовочные файлы стандарта C в коде C ++, если хотите.

Редактировать: Макрос, который помещает имена в пространство имен std в версии cstdio для GCC:

_GLIBCXX_BEGIN_NAMESPACE(std)

Вы можете проверить, что ваш собственный заголовок делает то, что он должен делать, пытаясь использовать что-то вроде:

std::printf( "hello" );

в вашем коде.

1 голос
/ 28 марта 2010

.h не нужен, просто если .h отсутствует в имени файла в файловой системе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...