簡體   English   中英

如何使C ++ 0x和__STRICT_ANSI__相處?

[英]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.

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