#define BLAH word
cout << BLAH;
有没有办法做到这一点?
尝试
#define STRINGIFY(x) #x
#define STRINGIFYMACRO(y) STRINGIFY(y)
#define BLAH word
cout << STRINGIFYMACRO(BLAH);
额外的间接级别导致宏的值被字符串化,而不是宏的名称。
'cout' 不是你做的。它是一个全局变量,是该std::ostream
类型的一个实例。你可以说例如“输出到cout
”。
#define
进行文本替换。这基本上与您在文本编辑器中使用搜索和替换来替换BLAH
为word
. 因此,线cout << BLAH;
变成cout << word;
。如果它不起作用,那是因为cout << word;
它不是该范围内的有效语句。预处理器不关心任何周围的文本。它对代码的理解基本上为零(它知道如何对代码进行标记,即如果您不添加任何空格,则将运算符和其他标点符号分开,仅此而已。)
如果要打印 word "word"
,可以执行以下操作:
#define STRINGIFY(x) #x
cout << STRINGIFY(word);
我怀疑你想要这样的东西:
#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);
}
(请注意,这会评估表达式,这是不必要的,但我怀疑这是一个问题。)
我正在测试一个用于不同数字表示的程序,即浮点数和双精度数。我希望它在定义的术语为浮点数时打印出:“测试浮点数”。
无需滥用宏作为原始类型定义:
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;
}
好的,让我们再试一次,根据您的评论:
我正在测试一个用于不同数字表示的程序,即浮点数和双精度数。我希望它在定义的术语为浮点数时打印出:“测试浮点数”。
听起来这就是你真正的意思:
我有如下代码:
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);