std=c++11を指定するとをインクルードできない

投稿者: Anonymous

現在WindowsのMinGw/gccを使用して、プログラミングの学習を行っている者です。
コンパイルオプションでstd=c++11を指定すると<bits/stdc++.h>をインクルードした際にエラーが発生します。
この問題はstd=c++11オプションと<bits/stdc++.h>を同時に使用した場合のみ発生し、どちらか一方のみを使用した際には問題なくコンパイルが通ります。
当方エラーメッセージも読めない初心者ですが、どうやらstdc++.h内でインクルードしている<cwchar>内で大量のエラーが起きているのだと解釈をしています。
しかし、これらのエラーは<cwchar>単体でインクルードした際には発生しません。

このエラーは以前は全く同じ条件でコンパイルをする際には発生していなかったものです。
また、その以前の環境からmingw/gccのアップデートなども行った記憶がなく、私が無自覚の内に環境に影響を与える操作をしたことが原因であると推測しているのですが、全く思い当たる節がなく、困っている状況です。
追記そこで、以前のように<bits/stdc++.h>単体でインクルードを完結させられる環境を取り戻したいと考えています。

下にエラーの出るコード、出ないコード、
そしてエラーメッセージの全文とgccのバージョン情報を載せておきます。
どうか皆様お力添えの程、宜しくお願い致します。

コンパイルオプションは次の通り指定しています。

D:StudyC++>g++ test.cpp -std=c++11

//これはコンパイルが通る
#include <iostream>
#include <cwchar>
using namespace std;

int main(){
    cout << "test" << endl;
}

//これは通らない
#include <bits/stdc++.h>
using namespace std;

int main(){
    cout << "test" << endl;
}

//エラーメッセージ

In file included from c:mingwlibgccmingw325.3.0includec++bitspostypes.h:40:0,
                 from c:mingwlibgccmingw325.3.0includec++iosfwd:40,
                 from c:mingwlibgccmingw325.3.0includec++ios:38,
                 from c:mingwlibgccmingw325.3.0includec++istream:38,
                 from c:mingwlibgccmingw325.3.0includec++sstream:38,
                 from c:mingwlibgccmingw325.3.0includec++complex:45,
                 from c:mingwlibgccmingw325.3.0includec++ccomplex:38,
                 from c:mingwlibgccmingw325.3.0includec++mingw32bitsstdc++.h:52,
                 from test.cpp:1:
c:mingwlibgccmingw325.3.0includec++cwchar:177:11: error: '::wcscat' has not been declared
   using ::wcscat;
           ^
c:mingwlibgccmingw325.3.0includec++cwchar:178:11: error: '::wcscmp' has not been declared
   using ::wcscmp;
           ^
c:mingwlibgccmingw325.3.0includec++cwchar:179:11: error: '::wcscoll' has not been declared
   using ::wcscoll;
           ^
c:mingwlibgccmingw325.3.0includec++cwchar:180:11: error: '::wcscpy' has not been declared
   using ::wcscpy;
           ^
c:mingwlibgccmingw325.3.0includec++cwchar:181:11: error: '::wcscspn' has not been declared
   using ::wcscspn;
           ^
c:mingwlibgccmingw325.3.0includec++cwchar:183:11: error: '::wcslen' has not been declared
   using ::wcslen;
           ^
c:mingwlibgccmingw325.3.0includec++cwchar:184:11: error: '::wcsncat' has not been declared
   using ::wcsncat;
           ^
c:mingwlibgccmingw325.3.0includec++cwchar:185:11: error: '::wcsncmp' has not been declared
   using ::wcsncmp;
           ^
c:mingwlibgccmingw325.3.0includec++cwchar:186:11: error: '::wcsncpy' has not been declared
   using ::wcsncpy;
           ^
c:mingwlibgccmingw325.3.0includec++cwchar:188:11: error: '::wcsspn' has not been declared
   using ::wcsspn;
           ^
c:mingwlibgccmingw325.3.0includec++cwchar:193:11: error: '::wcstok' has not been declared
   using ::wcstok;
           ^
c:mingwlibgccmingw325.3.0includec++cwchar:196:11: error: '::wcsxfrm' has not been declared
   using ::wcsxfrm;
           ^
c:mingwlibgccmingw325.3.0includec++cwchar:204:11: error: '::wcschr' has not been declared
   using ::wcschr;
           ^
c:mingwlibgccmingw325.3.0includec++cwchar:205:11: error: '::wcspbrk' has not been declared
   using ::wcspbrk;
           ^
c:mingwlibgccmingw325.3.0includec++cwchar:206:11: error: '::wcsrchr' has not been declared
   using ::wcsrchr;
           ^
c:mingwlibgccmingw325.3.0includec++cwchar:207:11: error: '::wcsstr' has not been declared
   using ::wcsstr;
           ^
c:mingwlibgccmingw325.3.0includec++cwchar: In function 'wchar_t* std::wcschr(wchar_t*, wchar_t)':
c:mingwlibgccmingw325.3.0includec++cwchar:213:55: error: invalid conversion from 'const wchar_t*' to 'wchar_t*' [-fpermissive]
   { return wcschr(const_cast<const wchar_t*>(__p), __c); }
                                                       ^
c:mingwlibgccmingw325.3.0includec++cwchar:212:3: note:   initializing argument 1 of 'wchar_t* std::wcschr(wchar_t*, wchar_t)'
   wcschr(wchar_t* __p, wchar_t __c)
   ^
c:mingwlibgccmingw325.3.0includec++cwchar: In function 'wchar_t* std::wcspbrk(wchar_t*, const wchar_t*)':
c:mingwlibgccmingw325.3.0includec++cwchar:217:58: error: invalid conversion from 'const wchar_t*' to 'wchar_t*' [-fpermissive]
   { return wcspbrk(const_cast<const wchar_t*>(__s1), __s2); }
                                                          ^
c:mingwlibgccmingw325.3.0includec++cwchar:216:3: note:   initializing argument 1 of 'wchar_t* std::wcspbrk(wchar_t*, const wchar_t*)'
   wcspbrk(wchar_t* __s1, const wchar_t* __s2)
   ^
c:mingwlibgccmingw325.3.0includec++cwchar: In function 'wchar_t* std::wcsrchr(wchar_t*, wchar_t)':
c:mingwlibgccmingw325.3.0includec++cwchar:221:56: error: invalid conversion from 'const wchar_t*' to 'wchar_t*' [-fpermissive]
   { return wcsrchr(const_cast<const wchar_t*>(__p), __c); }
                                                        ^
c:mingwlibgccmingw325.3.0includec++cwchar:220:3: note:   initializing argument 1 of 'wchar_t* std::wcsrchr(wchar_t*, wchar_t)'
   wcsrchr(wchar_t* __p, wchar_t __c)
   ^
c:mingwlibgccmingw325.3.0includec++cwchar: In function 'wchar_t* std::wcsstr(wchar_t*, const wchar_t*)':
c:mingwlibgccmingw325.3.0includec++cwchar:225:57: error: invalid conversion from 'const wchar_t*' to 'wchar_t*' [-fpermissive]
   { return wcsstr(const_cast<const wchar_t*>(__s1), __s2); }
                                                         ^
c:mingwlibgccmingw325.3.0includec++cwchar:224:3: note:   initializing argument 1 of 'wchar_t* std::wcsstr(wchar_t*, const wchar_t*)'
   wcsstr(wchar_t* __s1, const wchar_t* __s2)
   ^
In file included from c:mingwlibgccmingw325.3.0includec++ios:40:0,
                 from c:mingwlibgccmingw325.3.0includec++istream:38,
                 from c:mingwlibgccmingw325.3.0includec++sstream:38,
                 from c:mingwlibgccmingw325.3.0includec++complex:45,
                 from c:mingwlibgccmingw325.3.0includec++ccomplex:38,
                 from c:mingwlibgccmingw325.3.0includec++mingw32bitsstdc++.h:52,
                 from test.cpp:1:
c:mingwlibgccmingw325.3.0includec++bitschar_traits.h: In static member function 'static std::size_t std::char_traits<wchar_t>::length(const char_type*)':
c:mingwlibgccmingw325.3.0includec++bitschar_traits.h:358:26: error: 'wcslen' was not declared in this scope
       { return wcslen(__s); }
                      ^

//GCCのバージョン

gcc (GCC) 5.3.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

解決

他にも、MinGWでgcc 5.3.0を用いて同じエラーに遭遇した例があるようです。
http://www.cplusplus.com/forum/windows/197100/

英語版のStack Overflowによると、-std=c++11 を -std=gnu++11 にすると解消する場合があるとのこと。
https://stackoverflow.com/questions/38538924/g-updated-on-mingw-gets-massive-error-messages

-std=c++11 と -std=gnu++11 の違いは、後者はGNU拡張を有効化することです。

オプションなしの場合には使えたのに-std=c++11にすると使えない理由は調べ切れていませんが、bits/stdc++.hというヘッダファイルはC++の規格にはないGCC独自拡張のものなので、c++11有効下でこれを使うためには-std=gnu++11が必要と言うことかも知れません。

なお、GCC6.0からはデフォルトがC++14になったので-std=c++11 オプションはもはや不要なのですが、MinGWはまだ5.3.0までの対応のようですね。
https://gcc.gnu.org/gcc-6/changes.html
https://sourceforge.net/projects/mingw/files/MinGW/Base/gcc/

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *