2010-08-23 3 views
3

Ci-dessous quelque chose qui m'est arrivé et je n'ai pas pu trouver ce qui ne va pas. Mon collègue et moi avons foutu la tête autour de ça. Il était dans une bibliothèque multi-plateforme à l'aide des wxWidgets boîte à outils multi-plateforme sur WindowsÉtrange erreur pour la déclaration de la fonction membre

#include <wx/wx.h> 

class Graph { 
public: 
    // ... 
    // main1.cpp:4:10: error: expected identifier before '(' token 
    double GetYValue(double x); 
}; 

Nous essayions difficile de trouver un glyphe bizarre placé au lieu d'un ASCII e ou quelque chose, mais n'a pas trouvé une telle question . Ce qui se passait!?

+6

Est-ce que 'GetYValue' est une macro quelque part? – GManNickG

+2

On dirait que c'est probablement un remplacement de macro qui modifie le texte 'GetYValue' (ou quelque chose juste avant), mais je ne connais pas assez les wxWidgets pour deviner ce que cela pourrait être. Avez-vous vérifié à quoi ressemble cette ligne après le prétraitement? –

+2

Il est étrange de vous voir poser une question comme celle-ci, d'habitude c'est vous qui répondez! –

Répondre

9

WinGDI.h En 640: #define GetYValue(cmyk) ((BYTE)((cmyk)>> 8))

Gotta love windows.h

Voilà pourquoi je recommande de ne pas utiliser le cas de chameau pour la plupart des choses.

+0

Mais la plupart des standards (tous ceux que j'ai lus) utilisent tous les majuscules pour les MACROS. Donc, mon conseil est de ne pas faire des macros qui ne sont pas toutes majuscules et ne font pas de fonctions qui sont toutes majuscules. –

+0

Ouais haha ​​c'était le problème xD http://msdn.microsoft.com/en-us/library/dd372091%28VS.85%29.aspx silly windows.h ... –

+0

Oui, '' est un parasite. Il pollue des milliers d'identifiants communs en tant que macros. Cet en-tête se limite à quelques fichiers '.cpp' seulement. Et wxWidgets l'entraîne partout, donc le même conseil s'applique. Ou abandonnez simplement CamelCase en faveur de la convention de std_lib_ (quel que soit le nom). La librairie std C++ est beaucoup moins polluante. – sbi

7

Je n'utilise wxWidgets moi-même, mais dans http://gambit.sourcearchive.com/documentation/0.2006.01.20/plotctrl_8cpp-source.html que je trouve étrange fragment de code

#ifdef GetYValue // Visual Studio 7 defines this 
    #undef GetYValue 
#endif 

Regardez les en-têtes wxWidgets. Probablement y a-t-il un fragment de code comme celui-ci ou vous devriez faire quelque chose comme ça?

+0

+1 haha ​​je n'avais aucune idée d'autres ont trébuché sur cela aussi! –

6

Ma première hypothèse serait que <wx/wx.h> a une macro appelée GetYValue (et probablement un autre nom GetXValue) qui sont censés prendre une sorte de valeur combinée X/Y et « déballer » les dans leurs composants individuels, de l'ordre général de:

#define GetXValue(xy) ((xy)>>16) 
#define GetYValue(xy) ((xy)&x0ff) 

Avec cette expansion, votre code ressemblerait à quelque chose comme:

double ((xy)>>16)(double x); 

... à quel point le compilateur a un ajustement sifflants - sauf, bien sûr, qu'il a probablement donné jusqu'à l'analyse bientôt er que cela, puisque le double x semble essayer de passer deux jetons en tant que paramètres à une macro qui attend seulement 1.

Edit: Je vois que je devinais assez proche, mais deviné mal à propos de quel genre de "Y" était impliqué ici - les autres seraient apparemment GetCValue, GetMValue, etc., au lieu de GetXValue. Eh bien ...

+0

+1 belles explications tout autour. Je ne savais pas ce que je vais accepter. Une décision si difficile! –

Questions connexes