cpprestsdk如何使用MARCO定义常量
How does cpprestsdk use MARCO to define constants
例如在 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")
DAT(accept_charset, "Accept-Charset")
#undef DAT
};
生成的结果是
class header_names
{
_ASYNCRTIMP const static utility::string_t accept;
_ASYNCRTIMP const static utility::string_t accept_charset;
};
头文件包含静态变量的class声明。相应的定义,包括初始化,在 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
例如在 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")
DAT(accept_charset, "Accept-Charset")
#undef DAT
};
生成的结果是
class header_names
{
_ASYNCRTIMP const static utility::string_t accept;
_ASYNCRTIMP const static utility::string_t accept_charset;
};
头文件包含静态变量的class声明。相应的定义,包括初始化,在 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