En plus de la réponse plus littérale sur la raison pour laquelle le compilateur a interprété votre code de la façon dont il l'a fait : vous semblez avoir un problème XY Vous essayez de formater un pointeur vers un membre comme un entier, ce qui suggère fortement que vous vouliez faire quelque chose de différent.
Si ce que vous vouliez était un int
valeur stockée dans .c
vous devez soit créer une instance Foo some_foo;
et prendre some_foo.c
ou bien vous devez déclarer Foo::c
a static
membre, donc il y a un sans ambiguïté Foo::c
dans toute la classe. Ne prenez pas l'adresse dans ce cas.
Si ce que vous vouliez, c'était de prendre une adresse de la .c
membre d'une Foo
vous devez faire comme ci-dessus pour que Foo::c
es static
et se réfère à une variable spécifique, ou bien déclarer une instance et prendre son nom. .c
membre, puis prenez l'adresse. La bonne printf()
pour un pointeur d'objet est %p
et pour imprimer une représentation de pointeur d'objet avec <iostream>
et le convertir en void*
:
printf( "%p\n", &some_foo.c );
std::cout << static_cast<void*>{&some_foo.c} << '\n';
Si ce que vous voulez est le décalage de Foo::c
au sein de la classe Foo
vous voulez que le offsetof()
macro dans <stddef.h>
. Puisque sa valeur de retour est size_t
qui n'est pas de la même taille que int
sur les plates-formes 64 bits, vous devez soit convertir le résultat explicitement, soit passer le code d'accès à la base de données. printf()
el z
spécificateur de type :
#include <stddef.h>
/* ... */
constexpr size_t offset_c = offsetof( Foo, c );
printf( "%zu\n", offset_c );
cout << offset_c << '\n';
Quoi que vous essayiez de faire, si votre compilateur ne vous a pas averti de l'incompatibilité de type, vous devriez activer davantage d'avertissements. Ceci est particulièrement vrai pour quelqu'un qui code par essais et erreurs jusqu'à ce que le programme se compile.
25 votes
main.cpp:22:27: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int Foo::*’ [-Wformat=]
0 votes
@Angew -- Je répondais à un commentaire qui a maintenant été supprimé. Il disait que
Foo::c
n'avait pas été initialisé.