- ベストアンサー
ifdefとenum
asuncionの回答
- asuncion
- ベストアンサー率33% (2126/6288)
投稿を元にして、ちょっとしたサンプルを作ってみました。 実行結果に基づいて判断してみてください。 #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; } (注)インデントのため、全角空白を使っています。
関連するQ&A
- #ifdef の使い方
組み込み系のプログラムを現在勉強しています。 #ifdefについて質問させて頂きます。 下記コードの場合 #ifdef A ---- (1) Y = Z; #else -----#if B ------- (2) X = Z; ----#endif #endif ("-"は空白と思ってください。) この場合、Aが定義されていれば(1)が実行しコンパイル終了(#endif)。 Aが定義されていない場合、#else に行き、Bが定義されている場合は (2)を実行してコンパイル終了(#endif)という理解であっていますか? またこうした方が分かりやすいなど、アドバイス頂けると幸いです。 ご返答よろしくお願いします。
- ベストアンサー
- C・C++・C#
- #ifdef _DEBUGが効かない
こんにちは。 Win2000、VC++6.0使用。 今までC言語でプログラムを組んではいましたが、 #define _DEBUG #ifdef _DEBUG print(...); #endif というようにデバッグ用のコードを入れたことはありませんでした。 このような便利なものがあると知り、早速使ってみたのですが、 #define _DEBUG の一文をコメントアウトして、再コンパイル(リビルド) して実行してみたのですが、 普通に #ifdef _DEBUG #endif で囲まれた部分が実行されてしまいます。 #define _DEBUG を宣言しなければ、実行されないと思っていたのですが 自分の勘違いでしょうか? よくわかりません。 どなたかご存知の方、よろしくお願いします。
- 締切済み
- C・C++・C#
- Verilog_HDLでのdefineとifdef
yahooやgoogleで念入りに調べたつもりですが、自分の求めているようなHPは見つからなかったので、こちらの掲示板に記載させて頂きます。 すみませんが、誰かVerilog_HDLに詳しい方ご教授願いますでしょうか。 (1)「define」と「parameter」の用途の違いについて。 (2)「`ifdef」文と「if」文の用途の違いについて。 (3)「ifdef」の"def"は「define」の意味でしょうか。 -「define」の意の場合、「`ifdef <define_name>」のように<>の記述はdefineで定義された変数しか使用できないのでしょうか。 (4)下記例のように"test1/2"に定義値を持たせない場合は、どのようにして"test1/2"に値をアサインすれば宜しいのでしょうか。 サンプル記述例) `define test1 //定義値なしのdefine `define test2 `ifdef test1 //test1を真・偽させたい。 ------ `elsif test2 //test2を真・偽させたい。 ------ `endif (5)「ifdef」や「task」は、合成目的ではないテストベンチ等に使用するものと思っていましたが、「ifdef」や「task」を用いて組み合わせ回路等を開発したりするのでしょうか。 以上です。 すみませんが何方か宜しくお願いします。
- 締切済み
- その他(プログラミング・開発)
- #ifdefはどうやって使う?
よろしくお願いします。 現在趣味でゲームを作っています。 普通の#ifdefの使い方は存じているのですが、以下のような場合どうすればいいのでしょうか。 ゲームにはイージーと、ノーマルで2種類のレベルが設定出来ます。 イージーの場合は、最初の定義から、ボスのショットである boss_shot1()関数は上のイージー用の関数を通ります。 ノーマル設定の場合、 #define EASYを注釈にすることで、ノーマルの設定のboss_shot1();を通ります。 #define EASY #ifdef EASY void boss_shot1(){ //イージー用のショット } #else void boss_shot1(){ //ノーマル用のショット } #endif しかしこれでは、プログラム内でレベル設定をする事が出来ません。 注釈にしてコンパイルしたものと、#define EASYをそのままにしてコンパイルしたもの、2つの実行ファイルで レベル分けをしないといけません。 うまくプログラム内でこの条件分岐が出来ないでしょうか? 内容の違う関数は関数名を変えて記述するしかないのでしょうか? よろしくお願いします。
- ベストアンサー
- C・C++・C#
- C++のenumについて質問
C++のenum文で、 enum Sample { a, b, c, }; とあったとき、このSampleの要素数(?)である3を 何らかの方法で収得することは可能でしょうか?
- ベストアンサー
- C・C++・C#
- VC++2010 EE で #ifdef _MSC_VER #endi
VC++2010 EE で #ifdef _MSC_VER #endif でエラー ソース始まり // _msc_ver.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 // #ifdef _MSC_VER #include "stdafx.h" #endif int _tmain(int argc, _TCHAR* argv[]) { return 0; } ソース終わり > fatal error C1020: 予期しない #endif です。 と出ます。なぜでしょうか?
- ベストアンサー
- C・C++・C#
- プリプロセッサ#ifdef~#endifについて
C言語のプリプロセッサ#ifdef~#endifを使用して以下のソースファイルを作成しました。コンパイルするとエラーになります。 (pre.c)*********************** /* 各行の頭は行番号を表しています。*/ /* 実際のソースには記述していません。 */ 1: #include <stdio.h> 2: 3: #define TAB 0x61 4: #ifdef TAB 5: printf("%c", TAB); 6: #endif 7: 8: int main(void) { 9: return 0; 10: } ****************************** C:\>cl pre.c Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. pre.c pre.c(5) : error C2143: 構文エラー : ')' が '文字列' の前にありません。 pre.c(5) : error C2143: 構文エラー : '{' が '文字列' の前にありません。 pre.c(5) : error C2059: 構文エラー : '<不明>' pre.c(5) : error C2059: 構文エラー : ')' 原因について、どなたか教えて頂けませんでしょうか?
- ベストアンサー
- C・C++・C#
- enumの値から定義名を文字列化したい
C++でenumの値を元に、定義した名前(Fruits_Appleとか)を文字列として取得したいのですが、何か良い方法はないでしょうか? switch文等で分岐させて...という方法もありますが、enumの定義数が多くなるとコードが複雑になるので、シンプルな方法をさがしています。 enum Fruits{ Fruits_Apple, Fruits_Orange, Fruits_End }; void printFruits(Fruits fruits) { // ここで引数fruitsの値に応じて"Fruits_Apple"とか"Fruits_Orange"とかを // 文字列に代入したい std::string fruitsName = "Fruits_Apple"; }
- ベストアンサー
- C・C++・C#
- enumをintとして扱う必要があるパターンはあるのでしょうか。
enumをintとして扱う必要があるパターンはあるのでしょうか。 よく enum ENUM_SAMPLE { A, B, C, }; class CLASS_SAMPLE { private: int type; // ENUM_SAMPLEのA,B,Cしか入らない public: int GetType(){ return type; } }; という記述を良く見かけます。 class CLASS_SAMPLE { private: ENUM_SAMPLE type; // ENUM_SAMPLEのA,B,Cしか入らない public: ENUM_SAMPLE GetType(){ return type; } }; のほうが良いのではないか思うのですが、intで定義することによる利点が何かあるのでしょうか。 あと、過去に // bcc利用時に問題があるのでintに変更しました int CLASS_SAMPLE::GetType { return type; } というコメントがついたソースを見たことがあり、 自分でbccを使ってenumを返すように修正してテストしてみたことがあるのですが、何が問題なのか見つけることが出来ませんでした。 enum名を直接使用した場合に問題が発生することがあるのか、またどのような問題が発生することがあるのか、回答お願いします。
- ベストアンサー
- C・C++・C#
お礼
回答ありがとうございます。 残念ながら、実行結果が正しいのかどうかを疑っているところです ので、そこからは判断できません。 具体的には、リアルタイムOSのカーネルソースをコンパイルしよう として、生成情報の中のリソース使用数のデータ名としてenumで定 義した名前を与えてみたところ、#ifdefの対象外のため、ユーザ未 定義として初期値で上書きされてしまったが、それが基本仕様なの か不具合の類なのか判断がつかないという状況です。 コンパイラのマニュアルの言語仕様としては記述がなかったので、 暗黙でそういう規則があるのかどうか知りたいです。