显式c++宏扩展
Explicit C++ Macro Expansion
我想使所有日志功能包括文件和行,因此我需要一个宏。宏的定义方式如下:
inline void _internLogFunc(int line, const char* function, const char* data ...)
{...}
#define _InternLogParams(...) _internLogFunc(__LINE__, __FUNC__, __VA_ARGS__)
#define Log(...) _InternLogParams(__VA_ARGS__)
问题是,当函数以以下方式调用时:
Log("[Version]: "
#if defined(_RELEASE)
"RELEASE "
#elif defined(_PROFILE)
"PROFILE "
#else
"DEBUG "
#endif
#if defined(PURE_CLIENT)
"PURE CLIENT"
#elif (DEDICATED_SERVER)
"DEDICATED SERVER"
#else
"DEVELOPMENT BUILD"
#endif
);
宏展开如下:
> _internLogFunc(950,
> __FUNCTION__ ,
> "[Version]: "
> #if defined(_RELEASE) "RELEASE "
> #elif defined(_PROFILE) "PROFILE "
> #else "DEBUG "
> #endif
> #if defined(PURE_CLIENT) "PURE CLIENT"
> #elif (DEDICATED_SERVER) "DEDICATED SERVER"
> #else "DEVELOPMENT BUILD"
> #endif);
有没有人知道我如何使宏作为参数首先展开?
只是把所有的#ifedf
放在函数调用之外,并使用它们来定义一些文字字符串。例子:
#ifdef _RELEASE
#define VERSION "RELEASE"
#else
#define VERSION "DEBUG"
#endif
...
LOG(VERSION);
...
Your Log(…)宏接受变量参数,对它的调用由预处理器解析。它将接受大括号中看到的所有内容,并将其作为VA_ARG传递。
我怀疑这可能是在预处理器中使用省略号的限制。
在c++中编写Log()函数以避免预处理器以这种方式解析,或者在Log()调用之外使用宏来构建您想要输出的字符串。
例如:#if defined(_RELEASE)
#define DS1 "RELEASE "
#elif defined(_PROFILE)
#define DS1 "PROFILE "
#else
#define DS1 "DEBUG "
#endif
#if defined(PURE_CLIENT)
#define DS2 "PURE CLIENT"
#elif defined (DEDICATED_SERVbER)
#define DS2 "DEDICATED SERVER"
#else
#define DS2 "DEVELOPMENT BUILD"
#endif
#define DEBUG_STRING "[Version]: " DS1 DS2
Log(DEBUG_STRING, "Extra1", "extra2");
相关文章:
- 是否可以通过C++扩展强制多个python进程共享同一内存
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 扩展光电二极管探测器以支持多个传感器
- C++中的VLA,扩展名为std=C++11
- OpenGL 和 GLM 矩阵无法正确扩展,总是按比例缩小
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- C++返回 Numpy 数组的 Python 扩展模块
- 扩展可变参数模板中的变量名称
- 扩展C++生成的代码的模板参数类型名称
- 我想通过带有C++和Python的插件创建一个可扩展的应用程序
- VSCode IntelliSense无法识别SDL框架的SDL_image扩展库
- 将元组类型扩展为可变参数模板?
- 如何按文件扩展名引用文件夹中的文件
- HDF5Cpp 扩展复合数据集超板问题
- MSVC中的宏观扩展问题
- 嵌套参数包扩展失败
- C4204:使用的非标准扩展:非常量聚合初始值设定项
- [temp.variadic]中关于包扩展实例化的措辞
- 我应该包含什么来制作 boost.python 扩展?