2015-11-11 41 views
1

我在Cygwin上使用g ++(GCC)4.9.3。我無法在C++ 14標準中使用getchar_unlockedputchar_unlocked
考慮此示例代碼putchar_unlocked不能在C++ 14標準中工作

#include <cstdio> 

int main() { 
    putchar_unlocked('1'); 
    return 0; 
} 

當我編譯和

g++ foo.cpp && a.exe && rm ./a.exe 

運行我得到預期的輸出1.
但是當我做

g++ -std=c++14 foo.cpp && a.exe && rm ./a.exe 

我收到錯誤說putchar_unlocked沒有宣佈。

foo.cpp: In function 'int main()': 
foo.cpp:4:22: error: 'putchar_unlocked' was not declared in this scope 
    putchar_unlocked('1'); 
        ^
+1

...是的。當你使用強制編譯器符合標準的'-std = *'選項時,你不會得到非標準函數。這很重要,我不確定你的期望。 – hvd

+0

@ hvd,在[Ideone](https://ideone.com/wO7TPz)中工作? – avamsi

+0

我看到至少有三種可能性:1)Ideone沒有使用'-std = C++ 14'。 2)Ideone包含額外的命令行選項以使非標準功能可用。 3)Ideone正在使用不符合標準的庫實現。如果Ideone記錄它傳遞給編譯器的命令行選項,可以檢查其中的前兩個。 – hvd

回答

2

putchar_unlocked不是的C或C++的標準的任何版本的一部分,和Cygwin沒有實現任何其它的標準,它提供putchar_unlocked

Cygwin確實提供putchar_unlocked作爲非標準擴展,但您需要實際保留非標準擴展功能。

默認-std=版本是-std=gnu++03(或其同義詞之一)。這是C++ 03加上擴展。您將其更改爲-std=c++14。這是C++ 14 而不是擴展。使用-std=gnu++14可啓用分機。

+0

工作。謝謝! – avamsi

+1

好吧,幾乎沒有任何東西可以完全實現任何標準的任何版本,但是一些近似值足夠有用。 –

+0

@ n.m。當然。例如,我認爲glibc與POSIX緊密相關,即使它存在缺陷,但Cygwin不在同一類別中也沒有問題。 Cygwin的目的不在於符合POSIX,而是實際上缺少與這個問題直接相關的部分(POSIX功能宏)。請注意,我當然不會說這會讓Cygwin在一般情況下毫無用處 - 我廣泛使用它 - 僅僅作爲嘗試的POSIX實現沒有用處。 – hvd

2

putchar_unlocked不是任何C++標準的一部分。它是POSIX標準的一部分,但是定義-std=c++14導致gcc定義了__STRICT_ANSI__宏。 CygwinusesNewlib用於C標準庫,而from its sources我們可以看到,這樣可以防止putchar_unlocked被聲明,並且也沒有任何其他的宏來啓用它。

因此,我們需要擺脫__STRICT_ANSI__。使用-std=gnu++14應該這樣做:

g++ -std=gnu++14 foo.cpp && a.exe && rm ./a.exe 

問題下的評論指出,代碼與Ideone。這可能是因爲Ideone運行不同的平臺上(如Linux),這可能具有glibc,它提供putchar_unlocked不同條件(從this manual page):對於glibc的

功能測試宏要求(見 feature_test_macros(7)):

getc_unlocked(),getchar_unlocked(),putc_unlocked(), putchar_unlocked(): _POSIX_C_SOURCE> = 1 || _XOPEN_SOURCE || _POSIX_SOURCE || _BSD_SOURCE || _SVID_SOURCE

+0

這就是glibc文檔。 OP沒有使用glibc。 – hvd

+0

Cygwin不使用glibc,而是實際測試它,'_POSIX_SOURCE'不會使'putchar_unlocked'變爲可用。 – hvd

+0

@hyde,我得到了同樣的錯誤。 – avamsi

相關問題