error C2062: 型 'char' は不要です

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

error C2062: 型 'char' は不要です

投稿記事 by MoNoQLoREATOR » 13年前

error C2062: 型 'char' は不要です

こんなエラーを突きつけられたことはありませんか?
私は昔このエラーを解決できずに小一時間ほど悩み、「charなんてどこにも書いてないやんけ このポンコツ コンパイラが!」と心の中で叫んだきり、そのプログラムは御蔵入りなさってしまいました。

つい先日またもやこのエラーに遭遇したので、もしやと思ってsmallという単語にカーソルを当ててみると、

#define small char

と表示されるではありませんか!
『一体全体この世界のどこに small をマクロ定義するバカがいるんだよ!!щ(゚д゚щ)ガッシャーン』
ですよ、もう・・・ね?

調べてみると、どうやらRpcNdr.hというヘッダファイルをインクルードすると定義されてしまうらしいです。
解決方法は
標準ライブラリをインクルードした後に #undef small を定義する
ですね。

この記事によって、できるだけ沢山のプログラマーの方が救われますように。

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

Re: error C2062: 型 'char' は不要です

投稿記事 by MoNoQLoREATOR » 13年前

byteが・・・typedefされている・・・そして私はそれを・・・使っている・・・だとぉ・・・!?
byteがtypedefされていると聞いて、すっ飛んで確認しに行ったら・・・

typedef unsigned char byte

あああああああああああああああ。
カーソルを当てて絶望。
あれ?でもなんでコンパイルエラー出ないんですかね?
unsigned int byte = 0;
って書いてるんですけど?

ISLe さんが書きました:smallをマクロ定義する者やグローバルにtypedefする者を一刀両断なさっているではないですか。
MoNoQLoREATORさんにとってC++で安全に使えるライブラリを作るなんて簡単なことなのでしょう?
危険なマクロ定義をしないことや、グローバルでのtypedefを行わないことは、私のようなピヨピヨプログラマーでもできるから大口を叩いているだけのことです。決して、ライブラリ作成者よりも技術が上だから一刀両断しているというわけではありません。
ISLe さんが書きました:一部のCOMライブラリが使えなくなったりしないでしょうかね。
smallはIDLとC/C++の間でcharと区別するために用意されているものらしいので影響を受けるのはCOMです。
COMライブラリを開発するときにしか影響しないかもしれませんが。
COMというライブラリは初めて聞きましたが・・・何か問題が起きそうなら書き換えはやめておきますかね。

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

Re: error C2062: 型 'char' は不要です

投稿記事 by MoNoQLoREATOR » 13年前

byteがどう解釈されているのか調べたところ、ちゃんとこちらの期待通りに解釈されていることがわかりました。
どうやら変数としての識別が優先されるようです。
関数と同じ名前の変数を宣言した場合も変数としての識別が優先されていましたしね。

ISLe
記事: 2650
登録日時: 14年前

Re: error C2062: 型 'char' は不要です

投稿記事 by ISLe » 13年前

MoNoQLoREATOR さんが書きました:byteがどう解釈されているのか調べたところ、ちゃんとこちらの期待通りに解釈されていることがわかりました。
どうやら変数としての識別が優先されるようです。
変数としての識別が優先されるのではなくて、スコープで区別されるのですよ。
byteがグローバル(名前空間)にtypedefされている場合、名前空間に属さない外部変数をbyteという名前で宣言するとちゃんとエラーになります。
MoNoQLoREATOR さんが書きました:関数と同じ名前の変数を宣言した場合も変数としての識別が優先されていましたしね。
同じスコープで同じ名前の変数と関数を宣言すると後から宣言したほうがエラーになります。
変数が優先されたりはしませんよ。

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

Re: error C2062: 型 'char' は不要です

投稿記事 by MoNoQLoREATOR » 13年前

おや本当ですね。
「変数だから」という理由ではなかったようです。