cpprestsdk 如何使用 MARCO 定义常量

问题描述

例如在 include/cpprest/http_msg.h 中,header_names 被定义为:

class header_names
{
public:
#define _HEADER_NAMES
#define DAT(a,b) _ASYNCRTIMP const static utility::string_t a;
#include "cpprest/details/http_constants.dat"
#undef _HEADER_NAMES
#undef DAT
};

cpprest/details/http_constants.dat 中会有这样的部分:

#ifdef _HEADER_NAMES
DAT(accept,"Accept")
DAT(accept_charset,"Accept-Charset")
...
#endif

根据 DAT(a,b) 定义,未使用变量 b

但是当我们做一个简单的任务时:

auto a = header_names::accept;

变量 a 包含字符串 "Accept"

我不确定这怎么会发生。

我使用带有选项 godbolt.org-E 来获得以下代码的预处理器

class header_names
{
public:
#define DAT(a,b) _ASYNCRTIMP const static utility::string_t a;
DAT(accept,"Accept-Charset")
#undef DAT
};

生成的结果是

class header_names
{

_ASYNCRTIMP const static utility::string_t accept;
_ASYNCRTIMP const static utility::string_t accept_charset;

};

解决方法

头文件包含静态变量的类声明。相应的定义(包括初始化)在 release/src/http/common/http_msg.cpp 中。

#define _HEADER_NAMES
#define DAT(a,b) const utility::string_t header_names::a = _XPLATSTR(b);
#include "cpprest/details/http_constants.dat"
#undef _HEADER_NAMES
#undef DAT