#define BLAH word
cout << BLAH;
Y at-il un moyen de le faire?Existe-t-il un moyen de définir un terme défini?
#define BLAH word
cout << BLAH;
Y at-il un moyen de le faire?Existe-t-il un moyen de définir un terme défini?
'cout' n'est pas quelque chose que vous faites. C'est une variable globale, qui est une instance du type std::ostream
. Vous pourriez dire par exemple "sortie à cout
".
#define
fait une substitution textuelle. Il est fondamentalement le même que si vous avez utilisé search-and-replace dans votre éditeur de texte pour remplacer BLAH
par word
. Ainsi, la ligne cout << BLAH;
se transforme en cout << word;
. Si cela ne fonctionne pas, c'est parce que cout << word;
n'est pas une déclaration valide dans cette portée. Le préprocesseur ne se soucie pas du texte environnant. Il a essentiellement zéro compréhension du code (il sait tokenize le code, à savoir Segmenter les opérateurs et autres signes de ponctuation si vous ne mettez pas d'espace, mais qui est à ce sujet.)
Le mot que j'essaie d'imprimer est flottant, donc peut-être qu'il a des problèmes, car il reconnaît que c'est un type? – Jeff
... Si vous voulez imprimer un mot, il est entre guillemets. 'cout << mot;' signifie "afficher le contenu de la variable' word' dans la sortie standard ". 'cout <<" mot ";' signifie "afficher le mot' word' sur la sortie standard ". –
Si vous voulez d'imprimer le mot "word"
, vous pouvez faire:
#define STRINGIFY(x) #x
cout << STRINGIFY(word);
Vous avez réellement besoin d'un niveau de plus parce que l'OP veut imprimer le remplacement d'une macro. –
Essayez
#define STRINGIFY(x) #x
#define STRINGIFYMACRO(y) STRINGIFY(y)
#define BLAH word
cout << STRINGIFYMACRO(BLAH);
le niveau d'indirection supplémentaire entraîne la valeur de la macro à la place du de chaîne de caractères nom de la macro.
OK, nous allons essayer à nouveau ce, en fonction de votre commentaire:
Je teste un programme pour les différentes représentations du nombre, à savoir float et double. Je veux imprimer: "Testing for float" lorsque le terme défini est float.
On dirait que c'est ce que vous voulez dire vraiment:
je code comme suit:
cout << "As a float:" << float(value) << endl;
cout << "As a double:" << double(value) << endl;
et je veux faire une macro pour chacun ces lignes de sorte que le texte corresponde à la typographie.
Dans ce cas, vous voulez quelque chose comme ceci:
#define DEBUG(t, x) cout << "As a " #t ":" << t(x) << endl
DEBUG(float, value);
DEBUG(double, value);
Je suppose que vous voulez quelque chose comme ceci:
#include <typeinfo>
template <typename T>
void print_type()
{
std::cout << typeid(T).name() << std::endl;
}
int main()
{
print_type<float>();
print_type<int>();
}
Notez que la valeur de typeid(T).name()
est définie la mise en œuvre, et peut-être rien du tout. Il n'y a aucun moyen d'imprimer un type d'une manière garantie sans écrire une fonction vous-même, pour chaque type.
Vous pouvez faire une surcharge qui en déduit le type de l'expression aussi: (. Notez que ce évalue l'expression, ce qui est inutile, mais je doute que ce soit une préoccupation)
#include <typeinfo>
template <typename T>
void print_type(const T&)
{
std::cout << typeid(T).name() << std::endl;
}
int main()
{
print_type(5.0f);
print_type(5.0);
}
Je suis en train de tester un programme pour différentes représentations de nombres, c'est-à-dire float et double. Je veux imprimer: "Testing for float" lorsque le terme défini est float.
Pas besoin d'abuser de macros comme typedef primitive:
template<class T>
void do_test(char const *name) {
std::cout << "Testing " << name << "...\n";
T var = foo();
bar(var);
}
int main() {
do_test<float>("single precision");
do_test<double>("double precision");
return 0;
}
Avis cela vous permet de donner des noms différents (je l'espère plus significatives) pour chaque test, plutôt que stringizing les paramètres à l'épreuve, mais "float" et "double" pourraient être les noms si vous le souhaitez.
Si vous avez vraiment voulu stringize les paramètres - ou si vous êtes simplement curieux au sujet des macros:
#define DO_TEST(T) do_test<T>(#T)
int main() {
DO_TEST(float);
DO_TEST(double);
return 0;
}
Je ne sais pas ce que vous voulez dire. Qu'attendez-vous qu'il produise? Il sortira tout ce que le préprocesseur remplace par "BLAH". Si c'est quelque chose qui peut être inséré dans un 'std :: ostream', alors vous avez un programme de travail. –
Je teste un programme pour différentes représentations de nombre, c'est-à-dire flottant et double. Je veux l'imprimer: "Test pour float" lorsque le terme défini est flottant. – Jeff
Je ne sais toujours pas ce que vous essayez d'accomplir. De votre description de vos besoins, je ne comprends pas pourquoi vous ne pouvez pas simplement dire '#define TERM" float "', puis faire 'std :: cout << TERM << std :: endl;' –