私はC/Objective-Cでアプリケーションを開発しています(C ++はありません、私はすでにそこに解決策を持っています)、そして私は興味深いユースケースに出くわしました。
clangはネストされた関数をサポートしていないため、私の元のアプローチは機能しません。
#define CREATE_STATIC_VAR(Type, Name, Dflt) static Type Name; __attribute__((constructor)) void static_ ## Type ## _ ## Name ## _init_var(void) { /* loading code here */ }
このコードはGCCで正常にコンパイルされますが、clangはネストされた関数をサポートしていないため、コンパイルエラーが発生します。
期待される ';' 宣言の終わりに。
だから、私は関数内の変数でClangのために働く解決策を見つけました:
#define CREATE_STATIC_VAR_LOCAL(Type, Name, Dflt) static Type Name; ^{ /* loading code here */ }(); // anonymous block usage
ただし、マクロ連結を利用して、状況に適した連結を選択する方法があるかどうか疑問に思いました。たとえば、次のようになります。
#define CREATE_STATIC_VAR_GLOBAL(Type, Name, Dflt) static Type Name; __attribute__((constructor)) void static_ ## Type ## _ ## Name ## _init_var(void) { /* loading code here */ }
#define CREATE_STATIC_VAR_LOCAL(Type, Name, Dflt) static Type Name; ^{ /* loading code here */ }(); // anonymous block usage
#define SCOPE_CHOOSER LOCAL || GLOBAL
#define CREATE_STATIC_VAR(Type, Name, DFLT) CREATE_STATIC_VAR_ ## SCOPE_CHOOSER(Type, Name, Dflt)
明らかに、最終的な実装は正確にそれである必要はありませんが、同様のもので十分です。
で使用しようとしまし__builtin_constant_p
たが、コンパイル時定数ではないため、機能しませんでした__func__
。__func__
私も使用しようとし__builtin_choose_expr
ましたが、グローバルスコープでは機能しないようです。
ドキュメントに欠けているものは他にありますか?このようなことはかなり簡単なことのように思えますが、それでも私には理解できないようです。
注:マクロ連結を使用する代わりに、単純に入力できることは承知していますが、これはコンパイラーの限界を押し広げようとしている私CREATE_STATIC_VAR_GLOBAL
です。CREATE_STATIC_VAR_LOCAL
また、C ++を使用してこれをすぐに解決できることも認識していますが、それはここでの私の目標ではありません。