2016-07-01 9 views
0

finding-c++-static-initialization-order-problems、 マクロをヘッダファイルに定義したいとします。 "check_fiasco.h"とし、このヘッダーファイルをウォーレンスティーブンスのアイデアのようにすべてのcppファイルの先頭に置きます。しかし、私は彼のコードをlinuxの下で試してみましたが、うまくいきません(コンパイルされますが、実行されるとクラッシュします)。ファイル名でマクロを定義する

私は、次のマクロを試してみました:

#define TOKENCONCAT(x, y) x ## y 
#define file_init_(x, y) TOKENCONCAT(x, y) 
#define FIASCO_FINDER_DEC \ 
    void file_init_(file_, __FILE__)(void) ((constructor)) ; 

#define FIASCO_FINDER_IMPL \ 
    void file_init_(file_, __FILE__)(void) __attribute__ {\ 
     printf("Good Morning, %s!\n", __FILE__);\ 
     return ;\ 
    } 

しかし、これは「/」関数名に許可されていないと貼り付け、ファイル名として、動作しません。宣言と実装が同じでなければならないので、__COUNTER__を使用することはできません。

アイデア?

+0

これはC++の問題で、Cとは関係がありません.Cタグを削除します。 – Lundin

答えて

0

実際のシンボルはグローバルシンボルである必要はないため、ユニークにする必要があります。あなたが主張する場合は、コンパイラは翻訳単位ごとに一意になるようになります匿名の名前空間、にあなたのグローバル関数を置くことができ、

static void file_init_() ((constructor)) ; 

static void file_init_() 
{ 
    printf("Good Morning, %s!\n", __FILE__); 
} 

をまたは:static記号が正常に動作する必要があります。

+0

あなたはもっと詳しく説明できますか?私は、ヘッダーの外観、cppファイルのヘッダーの使い方を教えてください。たとえばWarren Stevensのアイデアを試してみましたが、それはコンパイルされましたが、私のプラットフォーム(アーム)では実行されません。これまでのところ、関数の宣言と実装をcppファイルに直接記述しています。しかし、私は何十万ものファイルを持っているので、私はヘッダファイルを使って試してみましたが、うまくいきませんでした:-( – pepero

+0

あなたが何を手がかりにする必要があるか分かりません。これを定義するだけです。 –

関連する問題