3
#define BLAH word

cout << BLAH;

有没有办法做到这一点?

4

6 回答 6

8

尝试

#define STRINGIFY(x) #x
#define STRINGIFYMACRO(y) STRINGIFY(y)

#define BLAH word
cout << STRINGIFYMACRO(BLAH);

额外的间接级别导致宏的值被字符串化,而不是宏的名称。

在 ideone 上测试

于 2011-01-14T03:57:11.277 回答
6
  1. 'cout' 不是你做的。它是一个全局变量,是该std::ostream类型的一个实例。你可以说例如“输出到cout”。

  2. #define进行文本替换。这基本上与您在文本编辑器中使用搜索和替换来替换BLAHword. 因此,线cout << BLAH;变成cout << word;。如果它不起作用,那是因为cout << word;它不是该范围内的有效语句。预处理器不关心任何周围的文本。它对代码的理解基本上为零(它知道如何对代码进行标记,即如果您不添加任何空格,则将运算符和其他标点符号分开,仅此而已。)

于 2011-01-14T03:41:10.960 回答
1

如果要打印 word "word",可以执行以下操作:

#define STRINGIFY(x) #x

cout << STRINGIFY(word);
于 2011-01-14T03:52:23.297 回答
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);
}

(请注意,这会评估表达式,这是不必要的,但我怀疑这是一个问题。)

于 2011-01-14T04:24:16.367 回答
1

我正在测试一个用于不同数字表示的程序,即浮点数和双精度数。我希望它在定义的术语为浮点数时打印出:“测试浮点数”。

无需滥用宏作为原始类型定义:

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;
}
于 2011-01-14T04:25:00.047 回答
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);
于 2011-01-14T03:58:21.670 回答