#define BLAH word
cout << BLAH;
有没有办法做到这一点?
答案 0 :(得分:5)
尝试
#define STRINGIFY(x) #x
#define STRINGIFYMACRO(y) STRINGIFY(y)
#define BLAH word
cout << STRINGIFYMACRO(BLAH);
额外的间接级别会导致宏的值被字符串化而不是宏的名称。
答案 1 :(得分:4)
'cout'不是你做的事。它是一个全局变量,是std::ostream
类型的实例。你可以说,例如“输出到cout
”。
#define
进行文字替换。它与您在文本编辑器中使用搜索和替换将BLAH
替换为word
基本相同。因此,行cout << BLAH;
变为cout << word;
。如果它不起作用,那是因为cout << word;
不是该范围内的有效语句。预处理器不关心任何周围的文本。它基本上没有对代码的理解(它知道如何对代码进行标记,即如果你没有放入任何空间就分开操作符和其他标点符号,但这就是它。)
答案 2 :(得分:1)
如果您想打印单词"word"
,可以执行以下操作:
#define STRINGIFY(x) #x
cout << STRINGIFY(word);
答案 3 :(得分:1)
我怀疑你想要这样的东西:
#include <typeinfo>
template <typename T>
void print_type()
{
std::cout << typeid(T).name() << std::endl;
}
int main()
{
print_type<float>();
print_type<int>();
}
请注意typeid(T).name()
的值是实现定义的,可能一点也不。对于每种类型,如果没有自己编写函数,就无法以有保证的方式打印出类型。
您也可以进行重载,以推断表达式的类型:
#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);
}
(请注意,这会评估表达式,这是不必要的,但我怀疑这是一个问题。)
答案 4 :(得分:1)
我正在测试一个程序,用于表示不同的数字表示,即float和double。我希望它打印出来:当定义的术语是浮动时,“测试浮动”。
无需滥用宏作为原始typedef:
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;
}
请注意,这可以让您为每个测试提供不同的名称(希望更有意义),而不仅仅是将参数字符串化为测试,但如果您愿意,可以将“float”和“double”作为名称。
如果你真的,真的想把参数字符串化 - 或者如果你只是对宏感到好奇:
#define DO_TEST(T) do_test<T>(#T)
int main() {
DO_TEST(float);
DO_TEST(double);
return 0;
}
答案 5 :(得分:0)
好的,让我们再试一次,根据您的评论:
我正在测试一个程序,用于表示不同的数字表示,即float和double。我希望它打印出来:当定义的术语是浮动时,“测试浮动”。
听起来这就是你的意思:
我的代码如下:
cout << "As a float:" << float(value) << endl;
cout << "As a double:" << double(value) << endl;
我希望为每一行创建一个宏,以便文本与类型转换相匹配。
在这种情况下,你需要这样的东西:
#define DEBUG(t, x) cout << "As a " #t ":" << t(x) << endl
DEBUG(float, value);
DEBUG(double, value);