29605


現在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:\Study\C++>g++ test.cpp -std=c++11
[code]

    //これはコンパイルが通る
    #include <iostream>
    #include <cwchar>
    using namespace std;
    
    int main(){
        cout << "test" << endl;
    }
    
[/code]

* * *
[code]

    //これは通らない
    #include <bits/stdc++.h>
    using namespace std;
    
    int main(){
        cout << "test" << endl;
    }
    
[/code]

//エラーメッセージ

[code]

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

//GCCのバージョン

[code]

    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.
    
[/code]


CC BY-SA 3.0
2016-10-11T06:59:03.983
29473
2016-10-16T06:00:32.400
2016-10-11T15:21:36.877
19098
19098
question
c++ gcc
std=c++11を指定すると<bits/stdc++.h>をインクルードできない


>
> 以前は問題なく実行できていたコードがコンパイルできなくなった事により、「自分が何か開発環境を破壊するような操‌​作をしてしまったのでは？」と不安になって‌​いる状態です。
> そこでエラーを取るというよりは、以前と同様の環境を取り戻すことを目的

質問者さんとしては変更したつもりがないが、何らかの変更があり、現在エラーメッセージが出る、とのこと。質問内容はわかりましたが、変更内容を推測するのは質問者さんご自身にしかわからないことだと思います。

  * 変更したつもりはないが実は変更していた
  * 環境変数PATHが変更されており、コンパイルに使用したg++が以前とは別のものに入れ替わっていた
  * 環境変数INCLUDEが変更されており、読み込むヘッダーファイルが別のものに入れ替わっていた

など第三者として推測はできますが答えは誰にも分らないかと。

* * *

以前の回答

[`::wcscat`](https://msdn.microsoft.com/ja-
jp/library/h1x0y282.aspx)等が宣言されていないようです。宣言するにはドキュメントにあるように

[code]

    #include <string.h>
    #include <bits/stdc++.h>
    
[/code]

または

[code]

    #include <wchar.h>
    #include <bits/stdc++.h>
    
[/code]

とする必要がありそうです。  
これは

> c:\mingw\lib\gcc\mingw32\5.3.0\include\c++\mingw32\bits\stdc++.h

というディレクトリ名からもわかりますが、GCCの問題ではなくmingw32の問題と思われます。


CC BY-SA 3.0
2016-10-11T09:40:25.307
29480
2016-10-11T21:37:10.533
2016-10-11T21:37:10.533
4236
4236
29473
answer


他にも、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/>


CC BY-SA 3.0
2016-10-16T06:00:32.400
29605
2016-10-16T06:00:32.400
2017-05-23T12:38:55.307
-1
10272
29473
answer