Garbage Collection

塵も積もれば山

目次

Blog 利用状況

ニュース

C++とかC#とか数学ネタを投下していく予定です。

[その他のページ]
日々の四方山話を綴った日記出水の日記帳

書庫

日記カテゴリ

[C++]おおっと!includeの強引な割り込み!!

#include はファイルの先頭におくことが多いですが、別にどこにあっても使えます。

 

[Fruits.lst]

X(Apple)

X(Grape)

X(Banana)

-----

こんなファイルを用意して…

#define X(A) A,

enum{

#include "Fruits.lst"

};

#undef X

こうすると、

enum{

Apple,

Grape,

Banana,

};

こう展開されるわけです。

 

#define X(A) #A,

const char *Fstr[]={

#include "Fruits.lst"

};

#undef X

こんなのを作れば、enumの数値を文字に直すことが出来ます。

printf("%s\n", Fstr[Banana]);  → "Banana"

 

文字列→数値はこんな関数でいけます。

int Fstr2index(const char *str){

for (int i = 0; i < sizeof(Fstr) / sizeof(Fstr[0]); i++){  if (strcmp(str, Fstr[i]) == 0) return i; }

return -1;

}

 

ただ、文字列→数値を使う機会が多くて数もある場合はmapを使うといいでしょう。

std::map<std::string, int> Fmap;

#define X(A) Fmap[#A] = A;

#include "Fruits.lst"

#undef X

 

前回のネタとあわせるとprefixやsuffixをつけることが出来ます。

#define X(A) Fruits_##A,

enum{

#include "Fruits.lst"

};

これで、Fruits_Apple, Fruits_Grape, Fruits_Bananaという名前で定義されます。

#define X(A) "Fruits_" #A,

文字列の方はこんな感じです。

投稿日時 : 2008年6月3日 17:48

Feedback

# re: [C++]おおっと!includeの強引な割り込み!! 2008/06/03 18:07 ひろえむ

アイデアはおもしろいけど、C++の人ってこういうコーディングを普通するものなんでしょうか?(^^;

なんだか、使い方を気をつけないと著しく可読性を落としているような気がしますが・・・。

あと、enumってenum [型の名前] {..};って形ではなかったっけ?(^^;

# re: [C++]おおっと!includeの強引な割り込み!! 2008/06/03 18:21 アキラ

> C++の人ってこういうコーディングを普通するものなんでしょうか?
ないないw
やるとしたら、神がかり的なライブラリを実装するためにやります

# re: [C++]おおっと!includeの強引な割り込み!! 2008/06/03 19:01 出水

仕事じゃやって欲しくないコーディングですけど、個人的には良く使ってます。

C++には匿名enumがあるので型名はなくてもいいです。
というか、匿名enumを作ってintで受ける方が主流のように思えます。

# re: [C++]おおっと!includeの強引な割り込み!! 2008/06/03 19:35 774RR

その手の要望があれば俺なら m4 使うっすね

# re: [C++]おおっと!includeの強引な割り込み!! 2008/06/03 19:51 あんどちん

> 匿名enumを作ってintで受ける方が主流のように思えます。
型を指定することで取り得る範囲を制限出来るので匿名enumよりも型指定する方が普通だと思ってました。

# re: [C++]おおっと!includeの強引な割り込み!! 2008/06/03 20:18 出水

主流って言い方は語弊がありますね、訂正します
てか、前にも思ったけどあんまりいいソース見てないって事ですなぁ…

>M4
おお、便利そう
Unix/Linux系には強くないんでMakefileを書くってのは
あんまり得意じゃないんですよ…

# re: [C++]おおっと!includeの強引な割り込み!! 2008/06/04 8:44 ひろえむ

Cしか知らないでC++はあまり詳しくないので教えてください。

匿名enumという単語を知らないのですがそれってtypedefとかで別名定義したりするってことですか?(^^;

それとも、型の名前を定義せずに利用できる方法がほかにあるということなのでしょうか?(^^;

# re: [C++]おおっと!includeの強引な割り込み!! 2008/06/04 9:54 ひろえむ

あ、そのまま変数定義して使うってことですね(^^;

自己解決です。 失礼しました(^^;

# [C++]鏡の中のリフレクション 2008/06/04 21:46 Garbage Collection

[C++]鏡の中のリフレクション

タイトル
名前
Url
コメント