Je travaille sur un projet où j'ai de nombreuses chaînes constantes formées par la concaténation (chiffres, etc.).
Par exemple, j'ai un ceci fonctionne simplement bien avec GCC et entraîne la l "fichier.cpp (42)" être inséré dans mon code. Cependant, lorsque vous essayez avec MSVC ++ (à l'aide de Visual C ++ 2008 Express), je reçois une erreur: p> Je comprends que le préfixe quel "fonctionne", mais donne la chaîne Donc, Ma question est la suivante: comment puis-je le faire appliquer à l'expression entière dans MSVC ++, afin que je puisse obtenir le même résultat que je reçois avec GCC? Je préférerais ne pas créer une deuxième chaîne avec des jetons entièrement à l'échelle, car je devrais alors conserver deux macros pour chacun, ce qui n'est pas très pratique et peut conduire à des bugs. De plus, j'ai besoin de la version étroite de chaque chaîne également, de sorte que l'utilisation de chaînes entièrement larges n'est pas une option non plus, malheureusement. P> p> Emplacement code> macro qui formate
__ fichier __ < / code> et
__ ligne __ code> dans une chaîne que je peux utiliser pour savoir où je suis dans le code, lors de l'impression de messages ou d'erreurs: p>
l code> est ajouté seulement au premier terme dans mon expression. J'ai aussi essayé ceci: p>
l "\" fichier.cpp \ "\" (\ "\" (\ "\" 42 \ "\") \ "" code> qui n'est évidemment pas très pratique (et pas ce que je recherche), en particulier pour que cette macro est simple comparée à d'autres macros. P>
3 Réponses :
Pour concaténer deux chaînes littérales larges, vous pouvez utiliser afin que vous puissiez définir p> (Remarque: non testé sur MSVC ++) p> p>
Cela fonctionnerait, mais cette macro n'est qu'une des nombreuses, et je préférerais ne les définir qu'une seule fois et ne pas avoir à entretenir deux copies (larges et étroites) de chaque macro, surtout si je les édite un jour. Cela pourrait facilement devenir une douleur à maintenir, même si je dois admettre que cela fonctionnerait!
Selon la norme C (AKA "ISO-9899: 1999" AKA "C99"), Visual C est faux et GCC est correct. Les états standards, section 6.4.5 / 4:
dans la phase de traduction 6, les séquences de caractères multibytes spécifiées par toute séquence de caractères adjacents et de jetons littéraux à chaîne large sont concaténés dans une seule séquence de caractères multibytes. Si l'un des jetons sont larges jetons littéraux à chaîne, la séquence de caractères multibytes résultante est traitée comme un large littéral à chaîne; Sinon, il est traité comme une chaîne de caractères littéral. em> p> afin que vous puissiez déposer une plainte. Sans doute, la version précédente de la norme C (AKA "C89" AKA "C90" AKA "ANSI C") n'a pas demandé la fusion de chaînes larges avec des cordes non larges. Bien que C99 ait maintenant plus de dix ans, il semble que Microsoft n'ait intérêt à faire de son compilateur C conformiste. Certains utilisateurs ont signalé de pouvoir accéder à certaines fonctionnalités "C99" en compilant C code C comme s'il s'agissait de CODE C ++, car C ++ inclut ces fonctionnalités - et pour C ++, Microsoft a fait un effort. Mais cela ne semble pas étendre au préprocesseur. P> Dans la dialecte C89, je pense que ce que vous recherchez n'est pas possible (en fait, je suis sûr de cela, et puisque j'ai écrit le mon propre Préprocesseur Je pense savoir de quoi je parle). Mais vous pouvez ajouter un paramètre supplémentaire et propager: P> #define W(x) W_(x)
#define W_(x) L ## x
#define N(x) x
#define STR(x, t) STR_(x, t)
#define STR_(x, t) t(#x)
#define LOCATION_(t) t(__FILE__) t("(") STR(__LINE__, t) t(")")
#define LOCATION LOCATION_(N)
#define WLOCATION LOCATION_(W)
Cela fonctionne, bien que ce soit une sorte de syntaxe maladroite et a beaucoup de frais généraux ... mais cela fonctionne et je n'ai pas à maintenir plusieurs macros. Espérons que Microsoft mettra à jour le préprocesseur de son soutien à la prise en charge de plus de fonctionnalités C99, les choses seraient beaucoup plus simples de cette façon. Merci!
Il suffit d'utiliser un littéral de chaîne large vide doit fonctionner:
#define WLOCATION L"" __FILE__ "(" STR(__LINE__) ")"