【问题标题】:What it means #value in a macro [duplicate]宏中的#value是什么意思[重复]
【发布时间】:2013-08-29 14:08:17
【问题描述】:

我在一个 SDK 示例程序中找到了以下宏。在这种情况下,#value 的含义是什么?

#define VALUE_CHAR(value)       #value, value

【问题讨论】:

标签: c++ c++11


【解决方案1】:

字符串化。请参阅this 页面。

所以

VALUE_CHAR(1)

扩展到:

"1", 1

您可以使用这种宏来简化数组的初始化,例如:

#define MYDEF(x) { #x, x }

static struct {
    const char *str;
    int num;
} values[] = {
    MYDEF(1),
    MYDEF(2),
    MYDEF(3)
};

【讨论】:

  • @trojanfoe:我们需要#value, value吗?因为我尝试使用#value,它确实有效。那为什么value需要写两次
  • @RasmiRanjanNayak 这取决于该特定宏对您正在使用的 API/框架的意义。
  • @RasmiRanjanNayak:在这个例子中,每个数组初始化器扩展为例如{ "1", 1 },将字符串和整数初始化为匹配值。仅使用#value 它会“工作”(在编译的意义上),但会使整数未初始化。
  • @trojanfoe:我只是想知道如何在上面的示例中创建这种结构的对象。这是一个非常好的编码。因为我尝试使用struct values val;struct values[0] val; 但它抛出错误。请帮帮我。
  • @RasmiRanjanNayak 好吧,我们偏离了你的问题,但在我的例子中,结构是 anonymous (它没有这样的类型)。如果你想在其他地方使用它,那么struct myvalue { const char *str; int num; }; 然后static struct myvalue values[] = { ... };。等等
【解决方案2】:

来自标准:

16.3.2 # 运算符 [cpp.stringize]

字符串文字是没有前缀的字符串文字。如果,在替换列表中,一个参数立即前面有一个# 预处理标记,则两者都被一个包含拼写的字符串文字预处理标记替换相应参数的预处理标记序列。

意思是:

#define VALUE_CHAR(value)    #value, value
VALUE_CHAR(some_value)

将扩展为:

"some_value", some_value

由预处理器。


例如,著名的 BOOST 库使用此运算符对令牌进行字符串化:

#define BOOST_STRINGIZE(X) BOOST_DO_STRINGIZE(X)
#define BOOST_DO_STRINGIZE(X) #X

Test库中的使用示例:

#define BOOST_AUTO_TEST_SUITE( suite_name )                             \
namespace suite_name {                                                  \
  TheFunction( BOOST_STRINGIZE( suite_name ) );                         \
//             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

// ...

BOOST_AUTO_TEST_SUITE( MyTest );

将扩展为:

namespace MyTest {
    TheFunction( "MyTest" );
//               ^^^^^^^^

【讨论】:

    猜你喜欢
    • 2022-11-25
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    相关资源
    最近更新 更多