error C2062: 型 'char' は不要です
こんなエラーを突きつけられたことはありませんか?
私は昔このエラーを解決できずに小一時間ほど悩み、「charなんてどこにも書いてないやんけ このポンコツ コンパイラが!」と心の中で叫んだきり、そのプログラムは御蔵入りなさってしまいました。
つい先日またもやこのエラーに遭遇したので、もしやと思ってsmallという単語にカーソルを当ててみると、
#define small char
と表示されるではありませんか!
『一体全体この世界のどこに small をマクロ定義するバカがいるんだよ!!щ(゚д゚щ)ガッシャーン』
ですよ、もう・・・ね?
調べてみると、どうやらRpcNdr.hというヘッダファイルをインクルードすると定義されてしまうらしいです。
解決方法は
標準ライブラリをインクルードした後に #undef small を定義する
ですね。
この記事によって、できるだけ沢山のプログラマーの方が救われますように。
error C2062: 型 'char' は不要です
Re: error C2062: 型 'char' は不要です
Windows SDKに含まれてますね。
ありふれた単語を識別子に使うのは避けたほうが良いと思います。
small識別子を使うこともそれをマクロ定義するのもどっちもどっちかと。
読みやすいコードを書こうとしたら識別子は自ずと2つ以上の単語の組み合わせになる気がします。
ありふれた単語を識別子に使うのは避けたほうが良いと思います。
small識別子を使うこともそれをマクロ定義するのもどっちもどっちかと。
読みやすいコードを書こうとしたら識別子は自ずと2つ以上の単語の組み合わせになる気がします。
Re: error C2062: 型 'char' は不要です
ありますよね、よくわからんマクロ。error C2062: 型 'char' は不要ですというのは知りませんが同じ原因の他のエラーなら何回か見たことあります。
ていうかやっぱり、マクロはせめて大文字にするべきですよね。まさかsmallがマクロ定義されてるなんて普通思わないですし。
ていうかやっぱり、マクロはせめて大文字にするべきですよね。まさかsmallがマクロ定義されてるなんて普通思わないですし。
Re: error C2062: 型 'char' は不要です
そうですかね。新月獅子 さんが書きました:ていうかやっぱり、マクロはせめて大文字にするべきですよね。まさかsmallがマクロ定義されてるなんて普通思わないですし。
minとかmaxを識別子に使わないのと根本的には同じだと思いますけど。
- MoNoQLoREATOR
- 記事: 284
- 登録日時: 14年前
- 住所: 東京
Re: error C2062: 型 'char' は不要です
返信ありがとうございます。
私はVisualStudio2008を使っております。
私は ~count とか ~handle とか、いちいち ~ をつけるのが面倒で、対象ごとに関数にわけてしまって、シンプルな名前をつけます。
だから small,big,min,max なんて よく使います。
また、基本的にマクロ定義はするべきではないと私は考えています。
今回の場合だと、typedef を使うべきですし、定数を定義したいのならば const つき変数を使うべきです。
マクロ定義にはスコープがないからです。
さらに、標準ライブラリ側は、ユーザーが絶対に使わないような識別子を使うべきであるはずです(ユーザーが使用する関数名は除く)。
識別子の頭にアンダーバーを2つつければ良いだけの話ですし。
私はVisualStudio2008を使っております。
私は ~count とか ~handle とか、いちいち ~ をつけるのが面倒で、対象ごとに関数にわけてしまって、シンプルな名前をつけます。
だから small,big,min,max なんて よく使います。
また、基本的にマクロ定義はするべきではないと私は考えています。
今回の場合だと、typedef を使うべきですし、定数を定義したいのならば const つき変数を使うべきです。
マクロ定義にはスコープがないからです。
さらに、標準ライブラリ側は、ユーザーが絶対に使わないような識別子を使うべきであるはずです(ユーザーが使用する関数名は除く)。
識別子の頭にアンダーバーを2つつければ良いだけの話ですし。
Re: error C2062: 型 'char' は不要です
組み込みやゲーム関係のライブラリを使っているとbyteがtypedefされているのをよく見かけます。
ライブラリによってunsigned charだったりcharだったりするので組み合わせて使えないことがあります。
同じ轍は踏むまいと思いますけどね。
RpcNdr.hはwindows.hの一部で標準ライブラリからはインクルードされません。
windows.hはC++専用ではないし他のC言語対応ライブラリを併用する場合にもあり得ることです。
他のライブラリに影響されないように翻訳単位できっちり分ければ良いのですよ。
保守のためにwindows.hに限らずDXライブラリとかDirectXとか環境依存コードを含む翻訳単位は限定しますよね。
C++でマクロを使うべきでないというのは分かりますが、C++専用ではないwindows.hにそれを言っても仕方ないと思います。
混ぜて使えないものを混ぜたら使えなかったというふうにしか見えません。
衝突したときはどちらかが悪いのではなくどちらも同じように悪いと思います。
ライブラリによってunsigned charだったりcharだったりするので組み合わせて使えないことがあります。
同じ轍は踏むまいと思いますけどね。
RpcNdr.hはwindows.hの一部で標準ライブラリからはインクルードされません。
windows.hはC++専用ではないし他のC言語対応ライブラリを併用する場合にもあり得ることです。
他のライブラリに影響されないように翻訳単位できっちり分ければ良いのですよ。
保守のためにwindows.hに限らずDXライブラリとかDirectXとか環境依存コードを含む翻訳単位は限定しますよね。
C++でマクロを使うべきでないというのは分かりますが、C++専用ではないwindows.hにそれを言っても仕方ないと思います。
混ぜて使えないものを混ぜたら使えなかったというふうにしか見えません。
衝突したときはどちらかが悪いのではなくどちらも同じように悪いと思います。
最後に編集したユーザー ISLe on 2012年5月06日(日) 02:31 [ 編集 3 回目 ]
- MoNoQLoREATOR
- 記事: 284
- 登録日時: 14年前
- 住所: 東京
Re: error C2062: 型 'char' は不要です
>>他のライブラリに影響されないように
>>翻訳単位できっちり分ければ良いのですよ。
と言いますと、具体的にどのようなことをすれば良いのでしょうか?
>>翻訳単位できっちり分ければ良いのですよ。
と言いますと、具体的にどのようなことをすれば良いのでしょうか?
Re: error C2062: 型 'char' は不要です
windows.hをインクルードするソースファイルとインクルードしないソースファイルに分ければ良いと思います。MoNoQLoREATOR さんが書きました:>>他のライブラリに影響されないように
>>翻訳単位できっちり分ければ良いのですよ。
と言いますと、具体的にどのようなことをすれば良いのでしょうか?
そうするとソースファイル単位で再利用できますし移植するのも楽になります。
- MoNoQLoREATOR
- 記事: 284
- 登録日時: 14年前
- 住所: 東京
Re: error C2062: 型 'char' は不要です
まあそうなのですが、windows.hの関数を使うソースファイルでは結局 何か対策をしなくてはならなくなりますよね。
こちらがネームスペースを設定するという手もありますが。
こちらがネームスペースを設定するという手もありますが。
Re: error C2062: 型 'char' は不要です
シンプルな名前を付けるのが信条なのですよね。MoNoQLoREATOR さんが書きました:まあそうなのですが、windows.hの関数を使うソースファイルでは結局 何か対策をしなくてはならなくなりますよね。
こうあるべきと主張しても他人任せの部分はどうしようもないですし。
windows.h(というかマクロ定義を含むヘッダファイル)との併用を避けないとこれからも同じことを繰り返して時間をたくさん無駄にしますよ。
いちいち
#define small char
を書くのは面倒じゃないのですか?
そのうちなぜ必要なのかも忘れてしまいますよ。
マクロ定義はネームスペースで防げないのでは。MoNoQLoREATOR さんが書きました:こちらがネームスペースを設定するという手もありますが。
もう忘れかけてますね。