1. ホーム
  2. c

[解決済み】GCCでマクロ内の関数に無効なストレージクラスがある

2022-02-22 19:54:33

質問

次のようなレガシー・マクロがあります。

#define ASYNC_FUNCTION(x)                                               \
void x(void) {                                                          \
    static void internal ## x (ASYNCIOCB *);                            \
    ASYNCIOCB *aiocb = AcquireAsyncIOCB();                              \
    CallAsyncNativeFunction_md(aiocb, internal ## x);                   \
}                                                                       \
static void internal ## x (ASYNCIOCB *aiocb)

に続いて、このようなものがあります。

#define ASYNC_FUNCTION_START(x)  ASYNC_FUNCTION(x) {
#define ASYNC_FUNCTION_END       ASYNC_resumeThread(); }

そして、その使い方は次のようになります。

ASYNC_FUNCTION_START(Occasional_function_name)
{
    //actual stuff    
}
ASYNC_FUNCTION_END

clでは問題なくコンパイルできましたが、gccでは

invalid storage class for function ‘internalOccasional_function_name’
     static void internal##x (ASYNCIOCB *);    
                 ^

どんな風になるのか、試しに全部展開してみましたが、何も壊れていませんでした。また、ファイル内の閉じていない曲がった括弧を検索してみると、他にもこんなマクロがありました。

#define Foo_Bar1()  {                                                \
  extern int foo;                                                    \
  int bar = foo;                                                     \
  if (condition) {                                                   \
    Bar_Foo();                                                       \
  }                                                                  \

#define Foo_Bar2()                                                   \
  if (condibar != footion1){                                         \
    AbortAsyncIOCB(aiocb);                                           \
    return;                                                          \
  }                                                                  \
  if (condition) {                                                   \
    Bar_Foo();                                                       \
  }                                                                  \
}

他のヘッダーは含まれていないので、最後のマクロが変に見える以外には、明らかなエラーは見つかりませんでした。私はcygwinを使用していますが、かなり無知です。

解決方法は?

静的関数を別の関数の内部で宣言することはできません。 宣言は void(x) :

#define ASYNC_FUNCTION(x)                                               \
static void internal ## x (ASYNCIOCB *);                                \
void x(void) {                                                          \
    ASYNCIOCB *aiocb = AcquireAsyncIOCB();                              \
    CallAsyncNativeFunction_md(aiocb, internal ## x);                   \
}                                                                       \
static void internal ## x (ASYNCIOCB *aiocb)

次に、プリプロセッサだけを経由してソースを実行すると gcc -E このようになります(スペースが追加されています)。

static void internalOccasional_function_name (ASYNCIOCB *);
void Occasional_function_name(void)
{
    ASYNCIOCB *aiocb = AcquireAsyncIOCB();
    CallAsyncNativeFunction_md(aiocb, internalOccasional_function_name);
}
static void internalOccasional_function_name (ASYNCIOCB *aiocb) 
{
    {
        int a=1;
    }
    ASYNC_resumeThread();
}