2009-09-25 5 views
4

Encore une fois, le port de l'application 32 bits à 64 bits. Je reçois l'erreur négative sur l'indice de déclaration C_ASSERT mentionné ci-dessous ..comment corriger l'erreur c2118: indice négatif


C_ASSERT (sizeof(somestruct) == some#define); 

Je lis aussi l'article http://support.microsoft.com/kb/68475 mais ne sais pas si je sais comment le résoudre dans ce cas.

L'aide est appréciée.

Merci d'avance.

+1

Qu'est-ce que # define exactement? – Mark

+0

Qu'est-ce que 'C_ASSERT'? S'il s'agit d'une affirmation statique, cette erreur indiquerait simplement un échec d'assertion. C'est une manière relativement courante d'implémenter l'assertion statique, ce qui entraîne une erreur d'indice négatif si la condition donne faux. – jalf

Répondre

10

Je devine que la macro C_ASSERT est défini comme ceci:

#define C_ASSERT(x) typedef char C_ASSERT_ ## __COUNTER__ [(x) ? 1 : -1]; 

C'est une affirmation de la compilation: si l'expression compilation x est vrai, cela se développe à quelque chose comme

typedef char C_ASSERT_1[1]; 

qui déclare le nomtype C_ASSERT_1 être un alias pour le type char[1] (gamme de 1 char). Converely, si l'expression x est fausse, il se développe à

typedef char C_ASSERT_1[-1]; 

qui est une erreur de compilation, puisque vous ne pouvez pas avoir un type de tableau de taille négative.

Par conséquent, votre problème est que l'expression sizeof(somestruct) == some#define est false, c'est-à-dire que la taille de somestruct N'EST PAS ce que votre code attend. Vous devez corriger cela - soit changer la taille de somestruct, soit changer la valeur de some#define, en vous assurant que cela ne casse rien.

+0

Ouais ... C'est vrai. La taille de struct ne correspond pas à la valeur #define car la structure avait deux pointeurs et la compilation 64 bits a changé la taille de la structure. Merci cependant et je l'ai compris tard dimanche soir et maintenant en mesure de le compiler. – Gentoo

Questions connexes