Non valide de classe de stockage pour une fonction dans une macro dans GCC

J'ai cet héritage macro

#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)

suivie par celui-ci

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

Et leur utilisation ressemble à ceci:

ASYNC_FUNCTION_START(Occasional_function_name)
{
    //actual stuff    
}
ASYNC_FUNCTION_END

Il compile bien avec cl, mais gcc donne

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

J'ai essayé de les étendre à tous, juste pour voir ce qu'il devient et trouvé rien de cassé. J'ai également recherché unclosed courbe entre crochets dans le fichier, et trouvé d'autres macros comme ce

#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();                                                       \
  }                                                                  \
}

Pas d'autres en-têtes sont inclus, afin que les autres que cette dernière macro à la recherche bizarre, je ne pouvais pas trouver toutes les erreurs évidentes. Je suis en utilisant cygwin, et je suis assez paumé.

  • Peut une fonction statique être déclarée à l'intérieur d'une autre fonction?
  • Je ne sais pas exactement de la même façon, mais les gens disent qu'il peut stackoverflow.com/a/11706921/2792852
  • OK... et pourquoi ?
  • Le code n'est pas la mienne, malheureusement. Je pourrais essayer de retirer static, mais je ne veux pas le voir aller en fou si il se casse quelque chose.
  • Il suffit de déplacer la dernière ligne de la première macro avant la x fonction, et de se débarrasser de l'intérieur de la fonction. Je veux dire, faire le prototype mondial.
  • Pour la référence, en supprimant static n'a compiler, mais je ne sais pas comment dangereux peut-être. Pour la fabrication à l'échelle mondiale, @eugene-sh pouvez-vous s'il vous plaît poster votre idée comme une réponse?
  • Il aurait une liaison interne, c'està-dire uniquement compilation-unité locale. De toute façon, cela ressemble à d'obfuscation de code et il sera difficile de maintenir&debug.

InformationsquelleAutor feos | 2016-05-25