有没有办法来宣传一个#defined术语?

时间:2011-01-14 03:36:49

标签: c++ c-preprocessor cout

#define BLAH word

cout << BLAH;

有没有办法做到这一点?

6 个答案:

答案 0 :(得分:5)

尝试

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

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

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

Tested on ideone

答案 1 :(得分:4)

  1. 'cout'不是你做的事。它是一个全局变量,是std::ostream类型的实例。你可以说,例如“输出到cout”。

  2. #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);