[英]How can I make C++0x and __STRICT_ANSI__ get along?
我需要在項目中使用popen
,但我得到:
error: 'popen' was not declared in this scope
看起來GCC在-std=c++0x
和(與我能夠找到的小信息相反)下定義__STRICT_ANSI__
-std=gnu++0x
,這導致popen
(和_popen
)從stdio
刪除。 奇怪的是,取消定義__STRICT_ANSI__
並沒有解決問題,也沒有正確聲明該功能。 我顯然錯過了一些東西。 有合理的解決方法嗎?
我使用的是MinGW 4.5.0,並升級到4.5.2,但我仍然遇到同樣的問題。 我寧願不必使用msys來編譯4.6.0,但如果必須的話,我會這樣做。
我只是立即在命令行上取消它,這不是非常“干凈”,但它可以正常工作。
-std=gnu++0x -U__STRICT_ANSI__
可能有一個很好的理由為什么不應該這樣做,但它給了我想要的東西(C ++ 0x加上GNU擴展,加上遺留的東西仍然有用)。 我已經做了很長時間了,從來沒有遇到過麻煩。 但如果它吃了你的貓,不要怪我。
我測試了MinGW gcc 4.6.1和gcc 4.7.0:它們都為-std=c++0x
定義__STRICT_ANSI__
,但是沒有為-std=gnu++0x
定義它。
對問題的簡短回答
如何使C ++ 0x和__STRICT_ANSI__相處?
應該是:使用-std=gnu++0x
而不是-std=c++0x
。 這不應該定義__STRICT_ANSI__
[1],所以有可能是別的東西在你Makefile
或構建環境,還是引起了這個被定義[2]。
然后,如其他人所指出的那樣(不太喜歡)解決方法是使用命令行開關-U__STRICT_ANSI__
來取消定義它。
注意,為了指定編寫代碼的C標准, -std=gnu++*
將是典型的開關,而不是-std=c++*
,只要你想要GNU擴展(在gcc
,GNU擴展是默認情況下啟用,但如果指定-std=c++*
,則將禁用。
另一個說明; 對於C,這是類似的:
$ touch empty.c
$ gcc -std=c99 -E -dM empty.c | grep '\(__STRICT\|__STDC_V\)'
#define __STRICT_ANSI__ 1
#define __STDC_VERSION__ 199901L
$ gcc -std=gnu99 -E -dM empty.c | grep '\(__STRICT\|__STDC_V\)'
#define __STDC_VERSION__ 199901L
您將獲得所需C語言的語言支持,無論__STRICT_ANSI__
定義了__STRICT_ANSI__
(也可能存在其他差異)。
[1]:
來自https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html :
__STRICT_ANSI__
當且僅當在調用GCC時指定-ansi開關或指定嚴格符合某些版本的ISO C或ISO C ++的-std開關時, GCC才定義此宏。 它被定義為'1'。 該宏主要用於指導GNU libc的頭文件將其定義限制為1989 C標准中的最小集合。
這種情況很容易確認(在gcc
4.8.2上運行):
$ touch empty.cpp
$ gcc -std=c++0x -E -dM empty.cpp | grep '__STRICT'
#define __STRICT_ANSI__ 1
$ gcc -std=gnu++0x -E -dM empty.cpp | grep '__STRICT'
$ # (no match)
[2]:添加-ansi
開關的東西也許? 這將產生__STRICT_ANSI__
,即使指定-std=gnu++*
,如文檔中所述(參見上面的引用),並且可以輕松檢查:
$ gcc -std=gnu++0x -E -dM -ansi empty.cpp | grep '__STRICT'
#define __STRICT_ANSI__ 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.