宏中的宏扩展
Macro expansion within a macro
本文关键字:扩展 更新时间:2023-10-16
我正在尝试创建 LOGDEBUG 宏:
#ifdef DEBUG
#define DEBUG_TEST 1
#else
#define DEBUG_TEST 0
#endif
#define LOGDEBUG(...) do { if (DEBUG_TEST) syslog(LOG_MAKEPRI(LOG_SYSLOG, LOG_DEBUG), __VA_ARGS__); } while (0)
...
size_t haystack_len = fminl(max_haystack_len, strlen(haystack_start));
LOGDEBUG(("haystack_len %ldn", haystack_len));
我没有使用 # 或 ## 参数来字符串化参数,但 g++ 显然试图字符串化它们:
numexpr/interpreter.cpp:534:5: error: invalid conversion from ‘size_t {aka long unsigned int}’ to ‘const char*’ [-fpermissive]
请注意,haystack_len
是size_t
的,我没有在宏中将其转换为char*
,但编译器将其视为如此。g++ 是否隐式尝试将宏参数转换为字符串?
如何解决?我的意思是,我正在使用 gnu LOG_MAKEPRI 宏进行系统日志记录,是这个宏可能会造成麻烦吗?另外,有没有办法查看宏扩展代码?
如何解决?
LOGDEBUG(("haystack_len %ldn", haystack_len));
使用一个唯一参数调用宏。所以它将产生:
do { if (DEBUG_TEST) syslog(LOG_MAKEPRI(LOG_SYSLOG, LOG_DEBUG), ("haystack_len %ldn", haystack_len)); } while (0);
并且("haystack_len %ldn", haystack_len)
使用逗号运算符并导致haystack_len
所以你必须这样称呼它:LOGDEBUG("haystack_len %ldn", haystack_len);
另外,有没有办法查看宏扩展代码?
gcc -E
可能会有所帮助。
相关文章:
- 是否可以通过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 扩展?