Imprimer type void en pur C
j'ai une fonction comme
void printMe (void *i)
{
printf("%d", i);
}
où je veux passer un pointeur void et l'imprimer à l'écran.
L'exemple ci-dessus est très bien si le " je " est integer, float ou double, mais se bloque si i est un char. Il n'y a pas de surcharge en C comme j'ai l'habitude d'utiliser en C++.
Donc la question est la suivante, peut-on créer une fonction en C qui va imprimer l'élément de qui est-il du paramètre, et si oui, comment est-ce possible car il totalement m'échappe en ce moment.
essayez de stackoverflow.com/questions/479207/function-overloading-in-c
La question semble confus - l'exemple fourni, imprimer le pointeur de la valeur, peu importe ce que vous faites - il n'a pas d'importance si le pointeur sur char, int ou double. Par "si i est un entier" voulez-vous dire un pointeur vers un entier, ou sont casting entier de pointeur? Code plus complet de l'échantillon pourrait aider.
La question semble confus - l'exemple fourni, imprimer le pointeur de la valeur, peu importe ce que vous faites - il n'a pas d'importance si le pointeur sur char, int ou double. Par "si i est un entier" voulez-vous dire un pointeur vers un entier, ou sont casting entier de pointeur? Code plus complet de l'échantillon pourrait aider.
OriginalL'auteur SMeyers | 2009-01-27
Vous devez vous connecter pour publier un commentaire.
Q1: Donc la question est la suivante, peut-on créer une fonction en C qui va imprimer l'élément de qui est-il du paramètre
Un: Pas de la façon que vous voulez. Vous aurez à passer de l'information à la fonction, en disant qu'il le type de données que vous êtes en passant.
T2: et si oui comment est-ce possible car il totalement m'échappe en ce moment.
Un: C'est éluder vous, car il ne peut pas être fait. Il n'y a pas de métadonnées associées à un void*, que le compilateur ou de l'exécution peut utiliser pour comprendre qu'il est de type elle est pointée. Vous devez soit
pointeur et de l'information sur ce qui
le pointeur de points (par exemple, un
enum).
des informations sur ce que le pointeur
points à
Que le code se dresse la seule chose que vous pouvez imprimer ici est l'adresse que je points à.
Un vide d'un pointeur sur les données brutes, les printf suppose que vous savez quel type de données que vous avez l'impression, il n'a pas d'intelligence et ne peut pas "figure it out" pour vous.
C'est aussi simple que cela.
Ce que vous pouvez faire est de passer des informations de type de la fonction, mais alors vous vous retrouvez avec quelque chose de très comme printf, c'est l'auto, où vous passerez un formatage de chaîne de caractères contenant les informations de type de données dans la suite arguments.
Espère que cette aide.
Aussi . . . "Il n'y a pas de surcharge en C comme j'ai l'habitude d'utiliser en C++"
Même en c++, la surcharge se produit au moment de la compilation, et ici il n'y a aucun moyen pour le compilateur de savoir quelles données seront passés à cette fonction, de sorte que même si vous avez l'habitude de surcharge, il ne serait jamais travailler de cette manière (par exemple, essayez la même chose à l'aide de printf, mais le compiler avec un compilateur C++, vous aurez exactement les mêmes résultats).
Effectivement essayer
dans la fonction ci-dessus, et il vous donnera l'adresse que j'ai des points à, pas la "valeur" de je.
Vous auriez besoin de cast i et derference avant, vous pouvez l'obtenir de la valeur
Donc, pour obtenir le dessus de travail en C++, vous auriez besoin d'avoir beaucoup de fonctions surchargées (ou une fonction de modèle, ce qui est vraiment la même chose, sauf que le compilateur rouleaux de fonctions pour vous), par exemple les fonctions surchargées
En c, vous avez juste besoin de donner à ces fonctions spécifiques noms
Soyez prudent, car autant que je suis conscient de ces macro astuces sont spécifiques au fournisseur (MS pour être précis). Si je me trompe, quelqu'un peut-il ajouter un commentaire disant cela? Merci
Le # de# l'opérateur de concaténation est une partie de la base du préprocesseur C spec.
aussi il y a quelques bibliothèques construites à l'aide de ces macro-astuces - faire semblant de surcharge de fonctions. intéressant de regarder tgmath.h par exemple ...
OriginalL'auteur
Pour commencer, vous avez l'impression que le pointeur, pas de ce qu'il désigne. Pour imprimer le contenu réel, vous avez besoin de passer
*i
àprintf
, pasi
.Si vous voulez vraiment pour ce faire, une seule solution:
... mais en fait je vois ce que vous dites, il a un sens dans le contexte de la question. Pardonnez-moi, je ne suis pas bien réveillé encore ...
OriginalL'auteur paxdiablo
Oui, nous le pouvons. Une telle fonction est déjà une partie de la bibliothèque standard -
printf
😉Comme il n'existe pas au moment de la compilation de surcharge de fonctions en C, vous devez fournir le type des arguments lors de l'exécution. Le
printf
chaîne de format peut être utilisé pour ce faire, il n'y a vraiment aucune raison de construire votre propre fonction wrapper quand il y a déjà une solution de travail.Je suis confus par vous êtes commentaire:
printf
déjà peut prendre des arguments de n'importe quel type; et il n'y a pas moyen de contourner connaître le type de la variable avant l'appel à la fonction d'impression que vous pourriez mettre en œuvre vous-même: sinon, comment savoir comment imprimer la valeur?OriginalL'auteur Christoph
Si vous essayez d'imprimer la valeur du pointeur, l'utilisation correcte est
printf("%p", i);
. Le " d " spécificateur pour les entiers, et le 'p' est pour les pointeurs. Il est de votre responsabilité d'obtenir ces correctes, et de mauvaises choses peuvent se produire si vous les mélangez.Je ne sais pas pourquoi ce serait un échec pour un char * et non un int *, et il est possible que vous avez d'autres problèmes à l'origine de ce. Si elle échoue encore avec %p, quelque chose d'autre a foiré. Voir si vous pouvez installer une sorte de mémoire logiciel de surveillance pour vérifier balançant des pointeurs ou des double gratuit (le)s, parce qu'à ce point de l'argent intelligent est que vous avez endommagé la mémoire quelque part.
OriginalL'auteur David Thornley