la concaténation de chaînes de caractères dans une instruction printf
gcc 4.7.2
c89
Bonjour,
#define LOG_ERR(fmt, ...) \
fprintf(stderr, "[ERROR] %s:%d: error [%s] " fmt "\n", __func__, __LINE__, strerror(errno), ##__VA_ARGS__)
Et je l'utilise comme ceci:
LOG_ERR("Failed to connect to message queue [ %d ]", msg_id);
L'esf a été concaténés dans la fprintf déclaration. Comment est-ce possible?
J'ai essayé de faire de même avec le suivant ci-dessous, juste pour tester le concept, mais a échoué avec une erreur de compilation:
/* Using char array */
const char name[] = "Joe";
printf("Hello how " name " how are you today?\n");
Using constant string literal
const char *name = "Joe";
printf("Hello how " name " how are you today?\n");
Fois jeu m'a l'erreur suivante:
expected ')' before name
Un grand merci pour toutes les suggestions,
Vous devez vous connecter pour publier un commentaire.
Lorsqu'il échoue, c'est parce que vous êtes à l'aide de variables. Les littéraux de chaîne peuvent être concaténés par le compilateur par exemple, si vous écrivez "abc", "123", alors le compilateur va traiter cela comme "abc123". Et quand vous faites cela dans la macro, le préprocesseur signifie que ce est exactement ce qui est envoyé au compilateur
devient
Pourrait être utile de vérifier la stringizer et la concaténation des macros trop (pour le préprocesseur -
#
et##
et je ne me souviens jamais lequel est lequel...)Andrew
Vous avez besoin d'un spécificateur de format, découvrez la documentation pour le printf
Votre tentative:
Regarde d'un peu plus de C++ish
Différence est que la macro est textuellement, de remplacer le mot
fmt
avec votre chaîne. Mettre deux ou plusieurs chaînes de caractères littérales ensemble vous procure la concaténation de chaînes.Rappelez-vous, seulement littérale cordes vont le faire. Cette ne pas de travail pour les variables.
Pense de macros comme un rechercher/remplacer dans votre code. Pour illustrer, considérons votre définition de macro -
Lorsque vous l'utilisez comme celui -
Il ne un texte de remplacement et devient -
Le side-by-side cordes et concaténés et le tour est joué -
Si vous souhaitez définir une macro pour
fprintf()
vous pouvez faire comme ce qui est le plus simple à mon humble avis.et de l'utiliser comme