error C2062: 型 'char' は不要です
こんなエラーを突きつけられたことはありませんか?
私は昔このエラーを解決できずに小一時間ほど悩み、「charなんてどこにも書いてないやんけ このポンコツ コンパイラが!」と心の中で叫んだきり、そのプログラムは御蔵入りなさってしまいました。
つい先日またもやこのエラーに遭遇したので、もしやと思ってsmallという単語にカーソルを当ててみると、
#define small char
と表示されるではありませんか!
『一体全体この世界のどこに small をマクロ定義するバカがいるんだよ!!щ(゚д゚щ)ガッシャーン』
ですよ、もう・・・ね?
調べてみると、どうやらRpcNdr.hというヘッダファイルをインクルードすると定義されてしまうらしいです。
解決方法は
標準ライブラリをインクルードした後に #undef small を定義する
ですね。
この記事によって、できるだけ沢山のプログラマーの方が救われますように。
error C2062: 型 'char' は不要です
- MoNoQLoREATOR
- 記事: 284
- 登録日時: 14年前
- 住所: 東京
Re: error C2062: 型 'char' は不要です
byteが・・・typedefされている・・・そして私はそれを・・・使っている・・・だとぉ・・・!?
byteがtypedefされていると聞いて、すっ飛んで確認しに行ったら・・・
typedef unsigned char byte
あああああああああああああああ。
カーソルを当てて絶望。
あれ?でもなんでコンパイルエラー出ないんですかね?
unsigned int byte = 0;
って書いてるんですけど?
byteがtypedefされていると聞いて、すっ飛んで確認しに行ったら・・・
typedef unsigned char byte
あああああああああああああああ。
カーソルを当てて絶望。
あれ?でもなんでコンパイルエラー出ないんですかね?
unsigned int byte = 0;
って書いてるんですけど?
危険なマクロ定義をしないことや、グローバルでのtypedefを行わないことは、私のようなピヨピヨプログラマーでもできるから大口を叩いているだけのことです。決して、ライブラリ作成者よりも技術が上だから一刀両断しているというわけではありません。ISLe さんが書きました:smallをマクロ定義する者やグローバルにtypedefする者を一刀両断なさっているではないですか。
MoNoQLoREATORさんにとってC++で安全に使えるライブラリを作るなんて簡単なことなのでしょう?
COMというライブラリは初めて聞きましたが・・・何か問題が起きそうなら書き換えはやめておきますかね。ISLe さんが書きました:一部のCOMライブラリが使えなくなったりしないでしょうかね。
smallはIDLとC/C++の間でcharと区別するために用意されているものらしいので影響を受けるのはCOMです。
COMライブラリを開発するときにしか影響しないかもしれませんが。
- MoNoQLoREATOR
- 記事: 284
- 登録日時: 14年前
- 住所: 東京
Re: error C2062: 型 'char' は不要です
byteがどう解釈されているのか調べたところ、ちゃんとこちらの期待通りに解釈されていることがわかりました。
どうやら変数としての識別が優先されるようです。
関数と同じ名前の変数を宣言した場合も変数としての識別が優先されていましたしね。
どうやら変数としての識別が優先されるようです。
関数と同じ名前の変数を宣言した場合も変数としての識別が優先されていましたしね。
Re: error C2062: 型 'char' は不要です
変数としての識別が優先されるのではなくて、スコープで区別されるのですよ。MoNoQLoREATOR さんが書きました:byteがどう解釈されているのか調べたところ、ちゃんとこちらの期待通りに解釈されていることがわかりました。
どうやら変数としての識別が優先されるようです。
byteがグローバル(名前空間)にtypedefされている場合、名前空間に属さない外部変数をbyteという名前で宣言するとちゃんとエラーになります。
同じスコープで同じ名前の変数と関数を宣言すると後から宣言したほうがエラーになります。MoNoQLoREATOR さんが書きました:関数と同じ名前の変数を宣言した場合も変数としての識別が優先されていましたしね。
変数が優先されたりはしませんよ。
- MoNoQLoREATOR
- 記事: 284
- 登録日時: 14年前
- 住所: 東京
Re: error C2062: 型 'char' は不要です
おや本当ですね。
「変数だから」という理由ではなかったようです。
「変数だから」という理由ではなかったようです。