error C2062: 型 'char' は不要です
こんなエラーを突きつけられたことはありませんか?
私は昔このエラーを解決できずに小一時間ほど悩み、「charなんてどこにも書いてないやんけ このポンコツ コンパイラが!」と心の中で叫んだきり、そのプログラムは御蔵入りなさってしまいました。
つい先日またもやこのエラーに遭遇したので、もしやと思ってsmallという単語にカーソルを当ててみると、
#define small char
と表示されるではありませんか!
『一体全体この世界のどこに small をマクロ定義するバカがいるんだよ!!щ(゚д゚щ)ガッシャーン』
ですよ、もう・・・ね?
調べてみると、どうやらRpcNdr.hというヘッダファイルをインクルードすると定義されてしまうらしいです。
解決方法は
標準ライブラリをインクルードした後に #undef small を定義する
ですね。
この記事によって、できるだけ沢山のプログラマーの方が救われますように。
error C2062: 型 'char' は不要です
- MoNoQLoREATOR
- 記事: 284
- 登録日時: 14年前
- 住所: 東京
Re: error C2062: 型 'char' は不要です
定義すべきは
#undef small
です。
ネームスペースを設定する対象はマクロ定義ではなく、自分が使う識別子に対して です。
namespace ~{}
のブレースの中では、デフォルトで~名前空間(自分自身)のものと識別されるので・・・・・・とか考えていたのですが、うまくいきませんでいした。
宣言する時点で無理でしたので。はい。
だから、結局 対処方法は #undef だけですね。
#undef small
です。
ネームスペースを設定する対象はマクロ定義ではなく、自分が使う識別子に対して です。
namespace ~{}
のブレースの中では、デフォルトで~名前空間(自分自身)のものと識別されるので・・・・・・とか考えていたのですが、うまくいきませんでいした。
宣言する時点で無理でしたので。はい。
だから、結局 対処方法は #undef だけですね。
Re: error C2062: 型 'char' は不要です
マジかよ・・・minとかmaxなんて普通に使っちゃうよ・・・ISLe さんが書きました:そうですかね。新月獅子 さんが書きました:ていうかやっぱり、マクロはせめて大文字にするべきですよね。まさかsmallがマクロ定義されてるなんて普通思わないですし。
minとかmaxを識別子に使わないのと根本的には同じだと思いますけど。
ほら、こんなにたくさんのコードで使われてる。
max
- 0130.c
- 0529.c
- 1109.c
- 1121.c
- 1147.c
- 1240.c
- 1315.c
- 2013.c
- 2101.c
- 2204.c
- 2362.c
- 0130.c
- 0135.c
- 0146.c
- 1045.c
- 1147.c
- 2007.c
- 2012.c
- 2204.c
最後に編集したユーザー みけCAT on 2012年5月13日(日) 16:50 [ 編集 1 回目 ]
理由: ホームページ移転に伴い、URLを削除しました。
理由: ホームページ移転に伴い、URLを削除しました。
Re: error C2062: 型 'char' は不要です
使ってはいけないなんて言ってませんよ。みけCAT さんが書きました:マジかよ・・・minとかmaxなんて普通に使っちゃうよ・・・
ほら、こんなにたくさんのコードで使われてる。
使わない場合の使わない理由のことなので使いたい場合は使えば良いと思います。
minマクロやmaxマクロが衝突する問題の方がsmallマクロより有名だと思ったんですけどそうでもないみたいですね。
gccで標準ライブラリだけ使っている分には関係無いですし。
最後に編集したユーザー ISLe on 2012年5月10日(木) 00:41 [ 編集 3 回目 ]
Re: error C2062: 型 'char' は不要です
ところで、マクロならまだいいですよ。
もしtypedefされていたら、#undefでは消せないので困ってしまいます。
(実際にそういう事例はあったかな・・・)
もしtypedefされていたら、#undefでは消せないので困ってしまいます。
(実際にそういう事例はあったかな・・・)
- MoNoQLoREATOR
- 記事: 284
- 登録日時: 14年前
- 住所: 東京
Re: error C2062: 型 'char' は不要です
グローバルでのtypedefとか・・・そのライブラリ作成者は超絶鬼畜ですね。
悪意しか感じられない・・・。
悪意しか感じられない・・・。
Re: error C2062: 型 'char' は不要です
純粋培養されたC++ライブラリだけ使っていれば良いのではないですか?
わずかでも組み込みと接点があるライブラリはC言語前提の可能性が高いので避けることをお勧めします。
事故車に追突して文句言ってもカッコ悪いですよ。
避けないのが悪いんですから。
MoNoQLoREATORさんはゲームプログラマ志望のようですが慎重に会社を選んでくださいね。
わずかでも組み込みと接点があるライブラリはC言語前提の可能性が高いので避けることをお勧めします。
事故車に追突して文句言ってもカッコ悪いですよ。
避けないのが悪いんですから。
MoNoQLoREATORさんはゲームプログラマ志望のようですが慎重に会社を選んでくださいね。
- MoNoQLoREATOR
- 記事: 284
- 登録日時: 14年前
- 住所: 東京
Re: error C2062: 型 'char' は不要です
>>純粋培養されたC++ライブラリだけ使っていれば
>>良いのではないですか?
自分がほしい機能を持ったライブラリの中に純粋培養されたC++ライブラリがない場合の方が多いと思います。
その場合はそれを使うしかありません。
windows.hのようなライブラリで純粋培養されたC++ライブラリってあるんでしょうか?
>>良いのではないですか?
自分がほしい機能を持ったライブラリの中に純粋培養されたC++ライブラリがない場合の方が多いと思います。
その場合はそれを使うしかありません。
windows.hのようなライブラリで純粋培養されたC++ライブラリってあるんでしょうか?
Re: error C2062: 型 'char' は不要です
なぜですか?MoNoQLoREATOR さんが書きました:自分がほしい機能を持ったライブラリの中に純粋培養されたC++ライブラリがない場合の方が多いと思います。
その場合はそれを使うしかありません。
使わなければ良いではないですか。
少なくとも同じ翻訳単位では。
無いのなら作れば良いではないですか。MoNoQLoREATOR さんが書きました:windows.hのようなライブラリで純粋培養されたC++ライブラリってあるんでしょうか?
一から書き起こされたwindows.hはいろいろありますよ。
あいにくC++で安全なものは知りませんが。
smallがマクロ定義されていたりbyteがグローバルにtypedefされているようなヘッダファイルに価値など無いでしょう。
そんなものに価値を感じるのはバカや超絶鬼畜と同じ人種ですよ。
- MoNoQLoREATOR
- 記事: 284
- 登録日時: 14年前
- 住所: 東京
Re: error C2062: 型 'char' は不要です
自分の力で作れるものならば、既に作っていることでしょう。
自分では作れないから困っているのです。
まあ、改造くらいはできるので、該当するsmallという単語を全てcharに置換して、某マクロ定義を削除することによって解決することはできそうですね。
自分では作れないから困っているのです。
まあ、改造くらいはできるので、該当するsmallという単語を全てcharに置換して、某マクロ定義を削除することによって解決することはできそうですね。
Re: error C2062: 型 'char' は不要です
smallをマクロ定義する者やグローバルにtypedefする者を一刀両断なさっているではないですか。MoNoQLoREATOR さんが書きました:自分の力で作れるものならば、既に作っていることでしょう。
自分では作れないから困っているのです。
MoNoQLoREATORさんにとってC++で安全に使えるライブラリを作るなんて簡単なことなのでしょう?
どうなんでしょうね。MoNoQLoREATOR さんが書きました:まあ、改造くらいはできるので、該当するsmallという単語を全てcharに置換して、某マクロ定義を削除することによって解決することはできそうですね。
一部のCOMライブラリが使えなくなったりしないでしょうかね。
smallはIDLとC/C++の間でcharと区別するために用意されているものらしいので影響を受けるのはCOMです。
COMライブラリを開発するときにしか影響しないかもしれませんが。
ちなみに最初は例えのつもりでしたが件のRpcNdr.hにもbyteがグローバルにtypedefされてます。
smallのマクロ定義のすぐ下に。
もしもの話ではありますがbyte識別子を使いたいときはどうするのですか?
byte識別子を使わないように気を付けるなんてことをしたらバカや超絶鬼畜に屈することになりますよ。