2017-09-25 2 views
0

J'ai besoin de quelque chose de très similaire mais avec un changement.Fonction de type vprintf mais qui prend un ID de chaîne

#include <stdio.h> 
#include <stdarg.h> 

void WriteFormatted (const char * format, ...) 
{ 
    va_list args; 
    va_start (args, format); 
    vprintf (format, args); 
    va_end (args); 
} 

int main() 
{ 
    WriteFormatted ("Call with %d variable argument.\n",1); 

    return 0; 
} 

Ce que je veux différent ci-dessus est que le premier paramètre est un identifiant de chaîne (un int). La fonction chargera alors la chaîne correspondante à cet identifiant et appliquera la mise en forme. Est-ce possible dans le bon sens? Donc, ma signature de fonction proposée deviendra comme suit, mais l'utiliser n'a pas vraiment de sens car le second paramètre doit être une chaîne.

void WriteFormatted3(int stringId, const char * format, ...) 
{ 
    // for demo, assume the following string corresponds to the stringId (hardcoded for this demo) 
    // just we can we run this without LoadString() id in a simple console application 
    char * str = "assume the id passed %d correspond to this string"; 

    va_list args; 
    va_start(args, format); 
    vprintf(str, args); 
    va_end(args); 
} 

int main() 
{ 
    WriteFormatted (STRING_ID_ONE_ARGUMENT, "1"); // 1 has to be string or it will not compile 

    return 0; 
} 

Mise à jour/justifcation

je pouvais toujours charger la première chaîne à partir de l'identifiant, puis appeler cette fonction WriteFormatted() d'origine, mais la raison pour laquelle je ne veux pas le faire est que je suis refactoring code et cet appel est beaucoup d'endroits. Donc je veux passer l'identifiant de chaîne et laisser la fonction charger cette chaîne au lieu de l'appeler tous les endroits.

+0

Comment ces identifiants et chaînes sont-ils stockés? – Elemental

+0

@Elemental sa chaîne de ressource. Basicall vous le chargez avec la fonction LoadString (id). Cette partie est très simple. – zar

+0

Je ne comprends pas pourquoi vous pensez que le second paramètre doit être une chaîne. – Elemental

Répondre

1

Si vous souhaitez gérer la chaîne format en tant que ressource, je vous suggère de réécrire le code comme suit. Je suppose que LoadString renvoie un std::string; sinon, ajustez le code en conséquence. Notez qu'il n'est pas très logique de fournir les deux, un identifiant représentant un format et un format: lequel passeriez-vous alors à vprintf? J'espère que cela aide.

void WriteFormatted (int stringId formatId, ...) 
{ 
    va_list args; 
    va_start (args, formatId); 
    std::string formatStr = LoadString(formatId); 
    const char* format = formatStr.c_str(); 
    vprintf (format, args); 
    va_end (args); 
} 

int main() 
{ 
    WriteFormatted (STRING_ID_ONE_ARGUMENT, 1); 

    return 0; 
}