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.
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas déclarer une fonction statique à l'intérieur d'une autre. Vous avez besoin de mettre la déclaration à l'extérieur de
void(x)
:Alors, si vous exécutez la source à travers tout le préprocesseur via
gcc -E
, vous obtiendrez quelque chose comme ceci (espacement supplémentaire ajoutée):static
déclaration de fonction n'est pas autorisée.En langage C la fonction locale déclarations peuvent éventuellement inclure la classe de stockage spécificateur de
extern
. C'est la seule classe de stockage spécificateur une fonction locale déclaration peut avoir. Aucune autre classe de stockage prescripteurs sont autorisés.6.7.1/7: