
組み込み系のプログラムを現在勉強しています。
#ifdefについて質問させて頂きます。
下記コードの場合
#ifdef A
---- (1) Y = Z;
#else
-----#if B
------- (2) X = Z;
----#endif
#endif
("-"は空白と思ってください。)
この場合、Aが定義されていれば(1)が実行しコンパイル終了(#endif)。
Aが定義されていない場合、#else に行き、Bが定義されている場合は
(2)を実行してコンパイル終了(#endif)という理解であっていますか?
またこうした方が分かりやすいなど、アドバイス頂けると幸いです。
ご返答よろしくお願いします。
No.1ベストアンサー
- 回答日時:
言葉の使い方に若干の不安を覚えます。
> Aが定義されていれば(1)が実行しコンパイル終了(#endif)。
「Aが定義されていれば(1)の部分のみがコンパイルされる」と言うべきでしょう。コンパイル時には(1)を実行しませんし、#endifでコンパイルが終了するわけでもありません。
> Bが定義されている場合は
#ifdef Bではなく#if Bなので、「Bが真であれば」が正しいです。
> またこうした方が分かりやすいなど
質問文にあるコードなら、下記のようにすると少し見やすくなります。
#ifdef A
---- (1) Y = Z;
#elif B
---- (2) X = Z;
#endif

No.2
- 回答日時:
#if B については、既に回答があるとおりです。
この場合、
#define B 0
などとしてあれば、条件は満たしませんし、
#define B 1
なら条件を満たします。
あと、最近の処理系では、defined が使えますので、
#if defined(A)
---- (1) Y = Z;
#elif B
----- (2) X = Z;
#endif
もおすすめです。
この場合だと、
#ifdef A
も
#if defined(A)
も余り変わりませんが、(むしろ文字数が多い)
#if defined(A) && defined(B)
のように、複数の条件が重なったときに、同じようにかけるというのがメリットです。
#ifndef A の場合は、
#if !defined(A)
と書けます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
アプリケーションのDLLファイル...
-
<unistd.h>をVisualStudioでつ...
-
Linux(g++)とAIX(XL C++)の挙動...
-
VC++6.0 で使用可能な、"Platfo...
-
リムーバブルディスクをPCへ挿...
-
CLRアプリと通常のアプリとの違い
-
C言語で作ったらWindowsでもMac...
-
math.hに含まれる関数が使えない
-
すべてのリビルド: 0 正常、 0 ...
-
cygwinのgccで正常にコンパイル...
-
#If True Then の # って何??
-
VS2010環境で2点ほど質問
-
パソコンソフトを作るには?
-
python エラー
-
vb2010にてASPWEBシステムを作...
-
[c++] <pthread.h>がinclude で...
-
リンカのエラー
-
コールバック関数指定時のエラー
-
” OS ビルド ” の意味が分か...
-
visual C++ でビルドの中止がで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
<unistd.h>をVisualStudioでつ...
-
アプリケーションのDLLファイル...
-
共有ライブラリの内容確認について
-
64ビットのlinuxで32ビットメモ...
-
プレコンパイルの意味を教えて...
-
math.hに含まれる関数が使えない
-
c言語です コンパイルした時に...
-
ビープ音が鳴りません・・・
-
C言語で、配列を使ったsinカー...
-
Cのコンパイルでコメントアウト...
-
すべてのリビルド: 0 正常、 0 ...
-
MVSマシンで0C7でABENDしたので...
-
Delphiでクラスをオブジェクト...
-
#If VBA7 Thenに関して
-
DLLは解読可能ですか
-
C#で char型とstring型の比較で...
-
[COBOL] ソースの復帰
-
gcc バージョン違いによるコン...
-
gccでc++プログラムをコンパイ...
-
シリアル通信の受信待ちについて
おすすめ情報