2010-04-21 6 views
1

J'essayais de compiler un module ruby, et mon compilateur s'est étouffé. Je pense qu'il pourrait avoir quelque chose à voir avec une ligne ruby.h:Syntaxe du prototype de soulignement C

void rb_check_type _((VALUE,int)); 

Je ne l'ai jamais vu cette syntaxe _ avant. Qu'est-ce que ça veut dire? Cela pourrait-il causer des problèmes pour mon compilateur (Visual Studio)?

Répondre

2

Cela ressemble fortement à une invocation de macro avec une macro nommée '_'. C'est les doubles parens qui sont le cadeau. Vous ne voyez généralement cela que dans les appels à des macros complexes qui veulent être en mesure de générer des appels de fonction avec un nombre arbitraire de paramètres.

Ainsi, les différentes possibilités semblent être:

  1. La macro ne doit pas être appelé « _ » et quelque chose a endommagé cette ligne. Peut-être que rb_check_type_ est le nom correct de la macro. Peut-être que quelque chose d'autre est. Rechercher des appels similaires et voir comment ils diffèrent.
  2. La macro est vraiment '_' et n'est pas définie pour une raison quelconque. Cela dépend des fichiers d'en-tête que vous incluez. En avez-vous oublié un?
  3. La macro existe et est vraiment '_' mais son expansion à quelque chose de mal. Cela pourrait être vérifié en regardant la sortie macro-développée du compilateur. La plupart des compilateurs ont un moyen de demander cela.

Je ne peux pas vraiment vous donner plus de conseils que cela, car vous n'avez pas donné de détails sur l'erreur réellement produite par votre compilateur.

1

La macro est vraiment nommée '_' dans ruby.h (ou un .h de ruby.h subordonné). Ce qui est pire, c'est que d'autres paquets font la même chose, par ex. wxWidgets. Sous g ++ 3.3 on pourrait:

#include "ruby.h" 
    #undef _ 
    #include "wx/filename.h" 

et la sortie compilée utiliserait la version wxWidget de _ (ce qui est arrivé travailler pour moi), mais sous g ++ 4.6.1 le #undef _ complètement Annule la définition malgré le #undef survenant avant les wxWidgets. Cela signifie:

  1. Je ne peux pas éteindre Ruby _ sans éteindre WX de _
  2. Je ne peux pas _ de laisser Ruby sans briser la façon dont les fonctions WX exécuter

La solution ne semble pas claire, sans les deux parties se éloigner à partir de macros. Je n'ai pas trouvé un moyen d'utiliser des espaces de noms dans mon propre code pour contourner ceci - toujours en train d'essayer ...