2010-03-28 56 views
3

這工作:何時.h不需要包含頭文件?

#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_ */ 
+1

也許看看命名空間聲明的宏_STD_BEGIN和_STD_END。 – 2010-03-28 09:47:39

+0

我不知道這個宏如何正確工作,但似乎它不包裹'stdio.h'? – user198729 2010-03-28 09:50:55

+0

'_STD_BEGIN'和'_STD_END'之間的'using'語句將這些名稱導入std名稱空間。他們現在可以作爲'size_t'和'std :: size_t'(不要問我爲什麼應該保持全局​​可見)。 - C++版本有其他區別。例如,看起來有些東西是C庫中的宏,C++將其重新定義爲普通函數。另外''各種增加對重載函數(C中沒有超載)等 – UncleBens 2010-03-28 10:22:43

回答

5

C++標準定義的頭文件不需要它,它們都沒有.h擴展名。的stdio.h C++版本是:

#include <cstdio> 

它包裝stdio.h,將名稱中它在C++ std命名空間, 但你仍然可以使用所有的C標準頭文件在C++代碼,如果你想。

編輯:是地名在cstdio的GCC版本std命名空間的宏:

_GLIBCXX_BEGIN_NAMESPACE(std) 

您可以檢查自己的頭做它應該做的,試圖使用的東西如:

std::printf("hello"); 

在您的代碼中。

+0

我看了看'cstdio',但沒有找到把名字放在'std'命名空間中的邏輯 – user198729 2010-03-28 09:39:02

+1

@ user198729我不知道你使用的是哪個編譯器,但這就是cstdio必須做的標準。 – 2010-03-28 09:43:06

+0

編譯器應該沒關係,它是頭文件本身,沒有提及任何關於'std'的地方。你可以看看它,也可以將它粘貼到我的帖子上面:) – user198729 2010-03-28 09:45:36

6

標準C++頭不使用.H。所有其他事情(或者更準確地說,其他所有事情都使用它想要的任何擴展名,.h,.hxx,.hpp,.hh和更多)。

標準C頭可以被包括在以下兩種方式之一:

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

第二種形式包裝其符號在std命名空間。

最初的意圖是,原則上,標題可以存儲在數據庫中的某種高度優化的預編譯狀態,在這種情況下,文件擴展的想法是沒有意義的。我不知道這在實踐中發生過。

+0

如果標準輸入輸出,如果它不是標準C++頭? – user198729 2010-03-28 09:23:13

+2

@user:'stdio'是標準的C頭文件。這些標題包含爲'#include '。 – kennytm 2010-03-28 09:23:58

+1

不,C的'stdio.h'封裝在C++的'cstdio'中。對於其他C頭文件也是如此。 – 2010-03-28 09:26:44

1

不需要.h,只需在文件系統中的文件名中省略.h即可。