10
votes

AVERTISSEMENT DE C ++ non-POD pour passer une chaîne?

void displayinfo(string &filename)
{
printf("%s% 38s\n", "Filename:", filename);
...
Warning: A non-POD object of type "std::string " passed as a variable argument to function "std::printf(const char*, ...)".There is nothing online explaining what that warning means.How would I get the printf to write this (assuming filename = test.txt):Filename: (right justify filename) test.txtThanks in advance.

0 commentaires

3 Réponses :


18
votes

L'explication est assez simple: seuls les gousses (structures de données anciennes simples) peuvent être transmises comme une dispute à une fonction variadique (pas une fonction variable modèle cependant, juste une simple fonction variable utilisant les ellipses ).

std :: string n'est pas une pod, mais vous pouvez faire: xxx

the c_str () fonction membre renvoie un const char * au CAPSULED C chaîne.


1 commentaires

@ user2369405: content que cela ait aidé



3
votes

printf , lorsqu'il est utilisé avec le < Code>% s Spécificateur de format, nécessite un pointeur pour char. Vous pouvez obtenir cela à partir d'un std :: string via la méthode c_str () méthode: xxx

comme un de côté, note que si vous N'avez pas l'intention de modifier ou de copier la chaîne d'entrée, vous devez passer par const référence: xxx


0 commentaires

0
votes

Je doute sérieusement que le filet serait silencieux. Peut-être avez-vous regardé de mauvais endroits ou avez utilisé NAD KeyWorrs.

La règle de base est simple, passant non-cossue comme ... L'argument est un comportement indéfini. Ne le faites pas à moins que votre implémentation a défini un comportement et correspond à votre tâche.

et en particulier pour la famille Printf, la chaîne de format nécessite des types spécifiques à réussir, vous avez cassé que même si le passage de POD a fonctionné.


0 commentaires