2011-01-21 5 views
4

J'essaie d'inclure rapidxml dans mon projet actuel. Cependant, il ne serait pas construire.Des sauts de code étranges se construisent dans MSVC. Qu'est-ce que ça veut dire?

Visual Studio se plaindrait de ce morceau de code (rapidxml.hpp: 419 + 451):

419: void *memory = allocate_aligned(sizeof(xml_attribute<Ch>)); 
420: xml_attribute<Ch> *attribute = new(memory) xml_attribute<Ch>; 

Le compilateur dirait

rapidxml.hpp (420): erreur C2061: erreur de syntaxe: identifiant 'memory'

Et je vois un peu comment cela pourrait perturber le compilateur. Cela m'embrouille beaucoup, moi aussi. Qu'est-ce que la partie (memory) de new(memory) xml_attribute<Ch> fait là?

Si je supprime cette partie (memory), elle compile très bien.
En outre, gcc le compile juste avec (memory) inclus.

Edit:
Oh, et je surchargées new avec DEBUG_NEW pour faire du débogage de mémoire. DEBUG_NEW ne prend pas en charge le placement nouveau.

+1

Il devrait toujours être plus facile de confondre un utilisateur que le compilateur ... Le compilateur devrait connaître sa langue et tous les détails sanglants, tandis que nous les utilisateurs sont limités et ne pouvons en savoir que beaucoup. –

Répondre

3

Ceci est ma suggestion. La "mémoire" elle-même est définie quelque part aussi comme une macro, et devient élargie ce qui provoque le problème. Donc, recherchez #define.memory (en utilisant des expressions régulières) pour voir si la mémoire est définie comme une macro.

En ce qui concerne la déclaration suivante, ce formulaire:

new(allocator) ObjectType(...) 

est utilisé lorsque vous voulez utiliser votre propre allocateur mémoire pour allouer de la mémoire pour vous.

Espérons que cela aide.

+0

À noter qu'une fois que vous souhaitez que certains objets de classe spécifiques soient alloués de façon personnalisée, vous devez simplement surcharger sa fonction de membre 'operator new' au lieu d'utiliser placement-new. – sharptooth

1

La syntaxe new (pointer) type(argument) est appelée placement nouvelle, et il représente essentiellement un appel au constructeur type avec la donnée argument sur la mémoire précédemment allouée à pointer.

La syntaxe, dans la mesure où elle est affichée, est correcte. Peut-être que quelques lignes au-dessus d'un point-virgule ou d'une erreur de syntaxe manquante compliquent l'analyseur syntaxique, mais memory comme identificateur est correclty utilisé défini dans la ligne précédente. (Et il n'est pas réservé par le langage pour la mise en œuvre)

3

Avez-vous #include <nouveau> dans ce fichier?

+0

@David: Je ne connais pas VC, mais g ++ l'exige. – Tomek

+0

Oui, il y a '#include ' dans ce fichier. – bastibe

Questions connexes