簡體   English   中英

為什么iostream包含time.h?

[英]Why does iostream include time.h?

考慮以下代碼:

#include <iostream>

template<class C>
struct time { };

int main() { }

它產生(GCC 4.5):

error: ‘template<class C> struct time’ redeclared as different kind of symbol
/usr/include/time.h:186:15: error: previous declaration of ‘time_t time(time_t*)’
  1. 為什么iostream包含time_t time(time_t*)
  2. 為什么iostreamstd命名空間之外包含time_t time(time_t*)
  3. (未答復) 為什么,如果我刪除template<class C> ,我不會收到此錯誤嗎?

如果你運行g++ -H -Wall -c testim.cc (其中testim.cc就是你的例子),你會看到

.... /usr/include/c++/4.6/bits/ios_base.h
..... /usr/include/c++/4.6/ext/atomicity.h
...... /usr/include/c++/4.6/x86_64-linux-gnu/./bits/gthr.h
....... /usr/include/c++/4.6/x86_64-linux-gnu/./bits/gthr-default.h
........ /usr/include/pthread.h
......... /usr/include/sched.h
.......... /usr/lib/gcc/x86_64-linux-gnu/4.6/include/stddef.h
.......... /usr/include/time.h

所以<time.h>包含在pthread支持中。

這是在Debian / Sid / AMD64上的GCC 4.6

似乎是我的盒子上的語言環境支持:

$ cat whytime.cc 
#define _TIME_H_
#include <iostream>

int main() {
  std::cout << "hello, world" << std::endl;
  return 0;
}

$ g++ -Wall -Werror -Wextra -ansi -o whytime whytime.cc && ./whytime
In file included from /usr/include/c++/4.2.1/cwchar:52,
                 from /usr/include/c++/4.2.1/bits/postypes.h:46,
                 from /usr/include/c++/4.2.1/iosfwd:49,
                 from /usr/include/c++/4.2.1/ios:43,
                 from /usr/include/c++/4.2.1/ostream:45,
                 from /usr/include/c++/4.2.1/iostream:45,
                 from whytime.cc:2:
/usr/include/c++/4.2.1/ctime:66: error: ‘::clock_t’ has not been declared
/usr/include/c++/4.2.1/ctime:68: error: ‘::tm’ has not been declared
/usr/include/c++/4.2.1/ctime:70: error: ‘::clock’ has not been declared
/usr/include/c++/4.2.1/ctime:71: error: ‘::difftime’ has not been declared
/usr/include/c++/4.2.1/ctime:72: error: ‘::mktime’ has not been declared
/usr/include/c++/4.2.1/ctime:73: error: ‘::time’ has not been declared
/usr/include/c++/4.2.1/ctime:74: error: ‘::asctime’ has not been declared
/usr/include/c++/4.2.1/ctime:75: error: ‘::ctime’ has not been declared
/usr/include/c++/4.2.1/ctime:76: error: ‘::gmtime’ has not been declared
/usr/include/c++/4.2.1/ctime:77: error: ‘::localtime’ has not been declared
/usr/include/c++/4.2.1/ctime:78: error: ‘::strftime’ has not been declared
In file included from /usr/include/c++/4.2.1/locale:46,
                 from /usr/include/c++/4.2.1/bits/ostream.tcc:46,
                 from /usr/include/c++/4.2.1/ostream:572,
                 from /usr/include/c++/4.2.1/iostream:45,
                 from whytime.cc:2:
/usr/include/c++/4.2.1/bits/locale_facets.tcc: In member function ‘_InIter std::time_get<_CharT, _InIter>::_M_extract_via_format(_InIter, _InIter, std::ios_base&, std::_Ios_Iostate&, tm*, const _CharT*) const’:
/usr/include/c++/4.2.1/bits/locale_facets.tcc:1839: error: invalid use of incomplete type ‘struct tm’
/usr/include/wchar.h:152: error: forward declaration of ‘struct tm’
/usr/include/c++/4.2.1/bits/locale_facets.tcc:1846: error: invalid use of incomplete type ‘struct tm’
/usr/include/wchar.h:152: error: forward declaration of ‘struct tm’
/usr/include/c++/4.2.1/bits/locale_facets.tcc:1854: error: invalid use of incomplete type ‘struct tm’
/usr/include/wchar.h:152: error: forward declaration of ‘struct tm’
/usr/include/c++/4.2.1/bits/locale_facets.tcc:1861: error: invalid use of incomplete type ‘struct tm’
/usr/include/wchar.h:152: error: forward declaration of ‘struct tm’
/usr/include/c++/4.2.1/bits/locale_facets.tcc:1873: error: invalid use of incomplete type ‘struct tm’
/usr/include/wchar.h:152: error: forward declaration of ‘struct tm’
/usr/include/c++/4.2.1/bits/locale_facets.tcc:1880: error: invalid use of incomplete type ‘struct tm’
/usr/include/wchar.h:152: error: forward declaration of ‘struct tm’
/usr/include/c++/4.2.1/bits/locale_facets.tcc:1883: error: invalid use of incomplete type ‘struct tm’
/usr/include/wchar.h:152: error: forward declaration of ‘struct tm’
/usr/include/c++/4.2.1/bits/locale_facets.tcc:1895: error: invalid use of incomplete type ‘struct tm’
/usr/include/wchar.h:152: error: forward declaration of ‘struct tm’
/usr/include/c++/4.2.1/bits/locale_facets.tcc:1900: error: invalid use of incomplete type ‘struct tm’
/usr/include/wchar.h:152: error: forward declaration of ‘struct tm’
/usr/include/c++/4.2.1/bits/locale_facets.tcc:1908: error: invalid use of incomplete type ‘struct tm’
/usr/include/wchar.h:152: error: forward declaration of ‘struct tm’
/usr/include/c++/4.2.1/bits/locale_facets.tcc:1912: error: invalid use of incomplete type ‘struct tm’
/usr/include/wchar.h:152: error: forward declaration of ‘struct tm’
/usr/include/c++/4.2.1/bits/locale_facets.tcc:1932: error: invalid use of incomplete type ‘struct tm’
/usr/include/wchar.h:152: error: forward declaration of ‘struct tm’
/usr/include/c++/4.2.1/bits/locale_facets.tcc:1968: error: invalid use of incomplete type ‘struct tm’
/usr/include/wchar.h:152: error: forward declaration of ‘struct tm’
/usr/include/c++/4.2.1/bits/locale_facets.tcc:1976: error: invalid use of incomplete type ‘struct tm’
/usr/include/wchar.h:152: error: forward declaration of ‘struct tm’
/usr/include/c++/4.2.1/bits/locale_facets.tcc: In member function ‘virtual _InIter std::time_get<_CharT, _InIter>::do_get_weekday(_InIter, _InIter, std::ios_base&, std::_Ios_Iostate&, tm*) const’:
/usr/include/c++/4.2.1/bits/locale_facets.tcc:2210: error: invalid use of incomplete type ‘struct tm’
/usr/include/wchar.h:152: error: forward declaration of ‘struct tm’
/usr/include/c++/4.2.1/bits/locale_facets.tcc: In member function ‘virtual _InIter std::time_get<_CharT, _InIter>::do_get_monthname(_InIter, _InIter, std::ios_base&, std::_Ios_Iostate&, tm*) const’:
/usr/include/c++/4.2.1/bits/locale_facets.tcc:2259: error: invalid use of incomplete type ‘struct tm’
/usr/include/wchar.h:152: error: forward declaration of ‘struct tm’
/usr/include/c++/4.2.1/bits/locale_facets.tcc: In member function ‘virtual _InIter std::time_get<_CharT, _InIter>::do_get_year(_InIter, _InIter, std::ios_base&, std::_Ios_Iostate&, tm*) const’:
/usr/include/c++/4.2.1/bits/locale_facets.tcc:2288: error: invalid use of incomplete type ‘struct tm’
/usr/include/wchar.h:152: error: forward declaration of ‘struct tm’

顯然GCC的iostream需要一些time的東西。

time_t是一個C語言的東西,它沒有名稱空間,因此對於向后可比性,它既在std名稱空間中,也不在std名稱空間中。

至於為什么沒有錯誤,我不是百分百肯定。 我知道C可以具有相同名稱的函數和結構,並且struct使用名稱struct進行限定,以便編譯器能夠區分它們。 C ++編譯器認為它是一個函數,除非在struct關鍵字之前。 http://ideone.com/XZB2M v http://ideone.com/kWMKE 我想它也可以實現向后兼容性?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM