プロが教えるわが家の防犯対策術!

下記のようなプログラムがありました。
同じシンボルに複数の型定義がある場合、単に後の定義が有効になるだけですか。
何のためにこんなことをやっているのか分からない。
(多分以下でスペースが表示されなくて見にくいと思いますが)

#ifdef __cplusplus
#define _WCHART
typedef wchar_t _Wchart;
typedef wchar_t _Wintt;
#else
typedef __WCHAR_T_TYPE__ _Wchart;
typedef __WCHAR_T_TYPE__ _Wintt;
#endif

A 回答 (5件)

>typedef wchar_t _Wchart;


>typedef wchar_t _Wintt;

>と同じような 2文があるのですが、単に前者は無視されるだけですよね。

その場合は、両方とも有効になります。
以下のソースで確認ください。
# include <stdio.h>
typedef short int shortA;
typedef short int shortB;
int main()
{
shortA a = 10;
shortB b = -20;
printf("%d:%d\n",a,b);
return 0;
}
-------------------------------
実行結果
10:-20

では、なぜ、わざわざ2つを定義するかというと、
_Wchartとして使いたい場合と_Winttとして使いたい場合があるから
としか言えまえん。
    • good
    • 0
この回答へのお礼

ありがとうございます。

第1引数と第2引数の意味を間違えていました。

お礼日時:2020/10/16 20:13

typedef xxxx yyyy



というのは xxxx という型に yyyy という名前を付けるという意味で
新たに定義されるシンボルは yyyy の方。
    • good
    • 0
この回答へのお礼

そうでしたね。
ありがとうございました。

お礼日時:2020/10/19 20:00

ちょっと今確認できてないけど, これはまずいんじゃないかなぁ. 少なくとも, ユーザープログラムではすべきでないと思う.



もっとも, __WCHAR_T_TYPE__ なんていう非標準のものをしれっと使ってることからすると
特定の処理系べったり (別の処理系のことなんか考えてないもんね)
なプログラムなのかもしれんけど.... あとで対応する人を不幸にしなきゃいいけど....
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2020/10/16 20:13

#1です。


間違っているところがあるのでしょうし。

#1で"実行"となっているところは間違えで、単にその内容を埋め込むだけです。
    • good
    • 0

#ifdef XXX


(A)
#else
(B)
#endif

の形は
XXXというマクロがすでに定義済みであれば(A)を、定義されていなければ(B)を実行するというプリプロセッサ構文です。
当然ですが(A)と(B)はいずれか一方しか実行されません。

今回の場合は__cplusplusが処理系で定義されているか否かで変数の型を変えます。C++のコンパイラでは__cplusplusが処理系で定義されているので前者を実行し、Cのコンパイラでは__cplusplusが定義されていないので後者が実行されます。
    • good
    • 0
この回答へのお礼

(A) の中が

typedef wchar_t _Wchart;
typedef wchar_t _Wintt;

と同じような 2文があるのですが、単に前者は無視されるだけですよね。

お礼日時:2020/10/16 14:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング