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 を定義する
ですね。

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

アバター
みけCAT
記事: 6734
登録日時: 14年前

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

投稿記事 by みけCAT » 13年前

それなんてコンパイラ?

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

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

投稿記事 by ISLe » 13年前

Windows SDKに含まれてますね。

ありふれた単語を識別子に使うのは避けたほうが良いと思います。
small識別子を使うこともそれをマクロ定義するのもどっちもどっちかと。
読みやすいコードを書こうとしたら識別子は自ずと2つ以上の単語の組み合わせになる気がします。

アバター
nullptr
記事: 239
登録日時: 13年前

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

投稿記事 by nullptr » 13年前

ありますよね、よくわからんマクロ。error C2062: 型 'char' は不要ですというのは知りませんが同じ原因の他のエラーなら何回か見たことあります。
ていうかやっぱり、マクロはせめて大文字にするべきですよね。まさかsmallがマクロ定義されてるなんて普通思わないですし。

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

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

投稿記事 by ISLe » 13年前

新月獅子 さんが書きました:ていうかやっぱり、マクロはせめて大文字にするべきですよね。まさかsmallがマクロ定義されてるなんて普通思わないですし。
そうですかね。
minとかmaxを識別子に使わないのと根本的には同じだと思いますけど。

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

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

投稿記事 by MoNoQLoREATOR » 13年前

返信ありがとうございます。

私はVisualStudio2008を使っております。

私は ~count とか ~handle とか、いちいち ~ をつけるのが面倒で、対象ごとに関数にわけてしまって、シンプルな名前をつけます。
だから small,big,min,max なんて よく使います。

また、基本的にマクロ定義はするべきではないと私は考えています。
今回の場合だと、typedef を使うべきですし、定数を定義したいのならば const つき変数を使うべきです。
マクロ定義にはスコープがないからです。

さらに、標準ライブラリ側は、ユーザーが絶対に使わないような識別子を使うべきであるはずです(ユーザーが使用する関数名は除く)。
識別子の頭にアンダーバーを2つつければ良いだけの話ですし。

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

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

投稿記事 by ISLe » 13年前

組み込みやゲーム関係のライブラリを使っているとbyteがtypedefされているのをよく見かけます。
ライブラリによって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' は不要です

投稿記事 by MoNoQLoREATOR » 13年前

>>他のライブラリに影響されないように
>>翻訳単位できっちり分ければ良いのですよ。

と言いますと、具体的にどのようなことをすれば良いのでしょうか?

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

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

投稿記事 by ISLe » 13年前

MoNoQLoREATOR さんが書きました:>>他のライブラリに影響されないように
>>翻訳単位できっちり分ければ良いのですよ。

と言いますと、具体的にどのようなことをすれば良いのでしょうか?
windows.hをインクルードするソースファイルとインクルードしないソースファイルに分ければ良いと思います。

そうするとソースファイル単位で再利用できますし移植するのも楽になります。

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

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

投稿記事 by MoNoQLoREATOR » 13年前

まあそうなのですが、windows.hの関数を使うソースファイルでは結局 何か対策をしなくてはならなくなりますよね。
こちらがネームスペースを設定するという手もありますが。

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

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

投稿記事 by ISLe » 13年前

MoNoQLoREATOR さんが書きました:まあそうなのですが、windows.hの関数を使うソースファイルでは結局 何か対策をしなくてはならなくなりますよね。
シンプルな名前を付けるのが信条なのですよね。
こうあるべきと主張しても他人任せの部分はどうしようもないですし。
windows.h(というかマクロ定義を含むヘッダファイル)との併用を避けないとこれからも同じことを繰り返して時間をたくさん無駄にしますよ。
いちいち
#define small char
を書くのは面倒じゃないのですか?
そのうちなぜ必要なのかも忘れてしまいますよ。
MoNoQLoREATOR さんが書きました:こちらがネームスペースを設定するという手もありますが。
マクロ定義はネームスペースで防げないのでは。
もう忘れかけてますね。