
No.2ベストアンサー
- 回答日時:
列挙体の定義は、#ifndefや#defineなどの前処理指令を解決した後で意味解析が行われます。
ですから、#ifndef指令が解決される段階では列挙定数INDEX_ENDは特定の意味を持つ存在としてはコンパイラに認識されません。結果として、INDEX_ENDはマクロとして定義されていない識別子ですので、#define INDEX_END 10が有効になります。ちなみに、#if INDEX_ENDとした場合、INDEX_ENDは定義されていないマクロ名ですので0として評価されることになります。
参考URL:http://portable-c.jugem.jp/?eid=7
No.3
- 回答日時:
暗黙の規則というか言語仕様書に書かれているかと。
C++ならISO/IEC14882:2003 16.1 Conditional inclusionあたり。
[... if the identifier is currently defined as a macro name ...]
「macro nameとして定義されてるか否か」が条件です。
# C言語は調べてませんがたしか一緒だったはず。
No.1
- 回答日時:
投稿を元にして、ちょっとしたサンプルを作ってみました。
実行結果に基づいて判断してみてください。
#include <stdio.h>
enum {
INDEX_A = 0,
INDEX_B,
INDEX_C,
INDEX_END
};
#ifndef INDEX_END
#define INDEX_END 10
#endif
int main(void)
{
printf("%d %d %d %d\n", INDEX_A, INDEX_B, INDEX_C, INDEX_END);
return 0;
}
(注)インデントのため、全角空白を使っています。
回答ありがとうございます。
残念ながら、実行結果が正しいのかどうかを疑っているところです
ので、そこからは判断できません。
具体的には、リアルタイムOSのカーネルソースをコンパイルしよう
として、生成情報の中のリソース使用数のデータ名としてenumで定
義した名前を与えてみたところ、#ifdefの対象外のため、ユーザ未
定義として初期値で上書きされてしまったが、それが基本仕様なの
か不具合の類なのか判断がつかないという状況です。
コンパイラのマニュアルの言語仕様としては記述がなかったので、
暗黙でそういう規則があるのかどうか知りたいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C# で 数式文字列処理を処理す...
-
Notepad++の関数リスト表示の変...
-
c#のTLS1.2での通信について
-
VisualStudioでC++クラスを追加...
-
Windows Formアプリからコンソ...
-
プログラマー達は何故、プログ...
-
C言語のことです。写真(見にく...
-
gccを行ってもexeファイルが生...
-
c言語
-
C++でデスクトップGUIアプリ開...
-
C言語 バッファについて。
-
visual studio 2022でのC#プロ...
-
プログラミングc++を全く分か...
-
C#でTreeViewのCheckBoxのサイ...
-
int16_t の _t は何?
-
DLLファイルの逆コンパイラにつ...
-
PIC12F1822でLED調光器を作りたい
-
c++の勉強方法を教えてくださ...
-
逆コンパイルと逆アセンブルの...
-
swift言語の最適化 swift最適化...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エラー(型が一致しません。)...
-
LRESULTとHRESULT
-
VB6でユーザー定義型がNothing...
-
#define 文
-
TextChangeイベントが発生しない
-
関数の定義
-
キーコード ?と/が同じですが...
-
VBS 名前定義の確認→ありかなし...
-
Oracle9iでのサーバー移行時のp...
-
関数
-
複数関数からの戻り値returnの指定
-
無償BorlandC++5.5でAPI(SDK)...
-
ifdefとenum
-
時間差を取得結果を求めるには
-
sleepの時間の値に変数を!
-
即時関数で
-
アクティブなウィンドウのみ、...
-
If 条件式
-
VBA:イベントの準備を別のイベ...
-
PHP + MySQL で登録時に重複チ...
おすすめ情報