2009-10-13 7 views
2

Bonjour, je dois transposer des éléments écrits en C++ depuis un OS de base unix vers windows Visual Studio 2008. Le code suivant implémente le type de données de tableau avec le pointeur ** void vers les données.Portage du code C++ d'unix vers les fenêtres


struct array 
{ 
    int id; 
    void **array; // store the actual data of the array 
    // more members 
} 

Lorsque je compile avec g ++ sur Unix, il est ok mais quand j'essaye avec MSVS 2008 je reçois l'erreur - erreur C2461: « array »: syntaxe du constructeur manquant paramètres formels. Quand je change le membre de 'array' en quelque chose d'autre cela fonctionne, il semble donc que le compilateur pense que le nom de membre 'array' est en fait le constructeur du tableau struct. Ce n'est évidemment pas une bonne pratique de nommer le membre comme la structure, mais c'est déjà écrit de cette façon. Puis-je dire au compilateur MSVS d'ignorer ce problème ou je devrais renommer tous les membres qui sont les mêmes que le nom de la structure.

+0

Avez-vous à compiler avec le compilateur C++ de Visual Studio? Utilisez MinGW pour compiler pour Windows et vous pourriez être en mesure de compiler sans changer autant de votre code. –

+0

Essayez-vous de le porter sur * managed * C++? Je conseillerais le portage à C++ non managé si faisable. –

Répondre

5

Vous avez un bogue dans le compilateur GCC. Le langage C++ interdit explicitement d'avoir des membres de données dont le nom est le même que le nom de la classe (voir 9.2/13). MS compilateur a raison de se plaindre à ce sujet. De plus, tout compilateur C++ est nécessaire pour émettre un message de diagnostic dans ce cas. Puisque GCC est silencieux même en mode '-ansi -pedantic -Wall', il s'agit d'un bug évident dans GCC.

Revison: Ce que j'ai dit ci-dessus n'est correct que dans la spécification "classique" C++ 98 du langage C++. Dans la spécification la plus récente, cette exigence s'applique uniquement aux statiques membres de la classe. Les membres de données non statiques peuvent maintenant partager le nom avec la classe. Je ne sais pas si ce changement est déjà dans la version officielle de la norme révisée.

Cela signifie que les deux compilateurs sont corrects à leur manière. Le compilateur MS s'en tient à la spécification "classique" C++ 98 du langage, tandis que GCC semble en implémenter une plus récente.

+0

Si c'est le cas, alors il devrait être capable de compiler avec le compilateur de MinGW, comme c'est un port de GCC. Je m'attendrais à ce qu'il ait les mêmes comportements (y compris les comportements bogués) que GCC. –

+0

Il est en C++ 2003 (section 9.2/13). Le paragraphe 13a ajoute une exigence selon laquelle si la classe contient un ctor déclaré par l'utilisateur, les membres de données non statiques doivent également avoir un nom différent du nom de la classe. –

3

Je dirais que si vous faites quelque chose que vous décrivez vous-même comme «pas une bonne pratique», alors vous devriez le changer.

+0

le problème est que le code c C++ qui est écrit pour unix n'est pas écrit de moi mon travail est juste de le porter sur windows :) –

2

Je renommerais votre attribut pour ne pas avoir le même nom que la classe. Cela rendra votre code plus portable. Si vous devez passer à un autre compilateur dans le futur, vous ne serez plus jamais confronté à ce problème.

Questions connexes