【问题标题】:Can the C++ preprocessor tell whether a token is a string?C++ 预处理器可以判断一个标记是否是一个字符串吗?
【发布时间】:2012-07-24 03:52:56
【问题描述】:

预处理器宏是否可以确定其参数是否为字符串(字面量)?

例如:

#define IS_STRING(token) ???

IS_STRING("foo")  // expands to 1
IS_STRING(foo)    // expands to 0

【问题讨论】:

  • 你想用这些信息做什么? C++(11) 中可能有一个编译时方法。我不认为预处理器有这样的东西。
  • 我正在尝试根据第一个参数是否为字符串来重载预处理器宏。不过,我刚刚意识到,我的方法是有缺陷的,因为没有什么可以阻止宏的用户声明一个命名的 const char* 并传递它而不是字符串文字,在这种情况下会调用错误的重载...
  • 您不能重载宏。见答案here
  • 你如何让它根据 args 的数量做不同的事情?
  • C++03 是可能的,基于转换为char*。如果它隐式转换为char* 并且是char const[N] 类型,则它是一个字符串文字。但是它是在编译器级别,而不是在预处理器级别。

标签: c++ macros c-preprocessor


【解决方案1】:

是的。但输出略有不同:

#define IS_STRING(token) "" token 

字符串文字会很好。对于非字符串,会报编译错误。

逻辑:编译器会自动连接字符串文字,所以如果token 是字符串文字,"" token 就可以正常工作。

Here is a related discussion.

【讨论】:

  • 有没有一种方法不会在其中一种情况下产生编译器错误?
  • @HighCommander4,不,这是不可能的。即使您制作的任何功能都超载。字符串文字将与数组或字符串发生冲突。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多