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年前

定義すべきは
#undef small
です。

ネームスペースを設定する対象はマクロ定義ではなく、自分が使う識別子に対して です。
namespace ~{}
のブレースの中では、デフォルトで~名前空間(自分自身)のものと識別されるので・・・・・・とか考えていたのですが、うまくいきませんでいした。
宣言する時点で無理でしたので。はい。
だから、結局 対処方法は #undef だけですね。

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

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

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

ISLe さんが書きました:
新月獅子 さんが書きました:ていうかやっぱり、マクロはせめて大文字にするべきですよね。まさかsmallがマクロ定義されてるなんて普通思わないですし。
そうですかね。
minとかmaxを識別子に使わないのと根本的には同じだと思いますけど。
マジかよ・・・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
min
  • 0130.c
  • 0135.c
  • 0146.c
  • 1045.c
  • 1147.c
  • 2007.c
  • 2012.c
  • 2204.c
Googleで検索して引っかかったものだけでこんなにある。重症かな・・・
最後に編集したユーザー みけCAT on 2012年5月13日(日) 16:50 [ 編集 1 回目 ]
理由: ホームページ移転に伴い、URLを削除しました。

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

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

投稿記事 by ISLe » 13年前

みけCAT さんが書きました:マジかよ・・・minとかmaxなんて普通に使っちゃうよ・・・
ほら、こんなにたくさんのコードで使われてる。
使ってはいけないなんて言ってませんよ。
使わない場合の使わない理由のことなので使いたい場合は使えば良いと思います。
minマクロやmaxマクロが衝突する問題の方がsmallマクロより有名だと思ったんですけどそうでもないみたいですね。
gccで標準ライブラリだけ使っている分には関係無いですし。
最後に編集したユーザー ISLe on 2012年5月10日(木) 00:41 [ 編集 3 回目 ]

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

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

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

ところで、マクロならまだいいですよ。
もしtypedefされていたら、#undefでは消せないので困ってしまいます。
(実際にそういう事例はあったかな・・・)

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

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

投稿記事 by MoNoQLoREATOR » 13年前

グローバルでのtypedefとか・・・そのライブラリ作成者は超絶鬼畜ですね。
悪意しか感じられない・・・。

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

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

投稿記事 by ISLe » 13年前

純粋培養されたC++ライブラリだけ使っていれば良いのではないですか?

わずかでも組み込みと接点があるライブラリはC言語前提の可能性が高いので避けることをお勧めします。
事故車に追突して文句言ってもカッコ悪いですよ。
避けないのが悪いんですから。

MoNoQLoREATORさんはゲームプログラマ志望のようですが慎重に会社を選んでくださいね。

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

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

投稿記事 by MoNoQLoREATOR » 13年前

>>純粋培養されたC++ライブラリだけ使っていれば
>>良いのではないですか?
自分がほしい機能を持ったライブラリの中に純粋培養されたC++ライブラリがない場合の方が多いと思います。
その場合はそれを使うしかありません。
windows.hのようなライブラリで純粋培養されたC++ライブラリってあるんでしょうか?

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

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

投稿記事 by ISLe » 13年前

MoNoQLoREATOR さんが書きました:自分がほしい機能を持ったライブラリの中に純粋培養されたC++ライブラリがない場合の方が多いと思います。
その場合はそれを使うしかありません。
なぜですか?
使わなければ良いではないですか。
少なくとも同じ翻訳単位では。
MoNoQLoREATOR さんが書きました:windows.hのようなライブラリで純粋培養されたC++ライブラリってあるんでしょうか?
無いのなら作れば良いではないですか。
一から書き起こされたwindows.hはいろいろありますよ。
あいにくC++で安全なものは知りませんが。

smallがマクロ定義されていたりbyteがグローバルにtypedefされているようなヘッダファイルに価値など無いでしょう。
そんなものに価値を感じるのはバカや超絶鬼畜と同じ人種ですよ。

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

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

投稿記事 by MoNoQLoREATOR » 13年前

自分の力で作れるものならば、既に作っていることでしょう。
自分では作れないから困っているのです。

まあ、改造くらいはできるので、該当するsmallという単語を全てcharに置換して、某マクロ定義を削除することによって解決することはできそうですね。

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

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

投稿記事 by ISLe » 13年前

MoNoQLoREATOR さんが書きました:自分の力で作れるものならば、既に作っていることでしょう。
自分では作れないから困っているのです。
smallをマクロ定義する者やグローバルにtypedefする者を一刀両断なさっているではないですか。
MoNoQLoREATORさんにとってC++で安全に使えるライブラリを作るなんて簡単なことなのでしょう?
MoNoQLoREATOR さんが書きました:まあ、改造くらいはできるので、該当するsmallという単語を全てcharに置換して、某マクロ定義を削除することによって解決することはできそうですね。
どうなんでしょうね。
一部のCOMライブラリが使えなくなったりしないでしょうかね。
smallはIDLとC/C++の間でcharと区別するために用意されているものらしいので影響を受けるのはCOMです。
COMライブラリを開発するときにしか影響しないかもしれませんが。

ちなみに最初は例えのつもりでしたが件のRpcNdr.hにもbyteがグローバルにtypedefされてます。
smallのマクロ定義のすぐ下に。
もしもの話ではありますがbyte識別子を使いたいときはどうするのですか?
byte識別子を使わないように気を付けるなんてことをしたらバカや超絶鬼畜に屈することになりますよ。