Android-NDK-需要1+args的可变宏
Android - NDK - Variadic macro requiring 1+ args
我的日志库中有以下宏:
#define TRACE_E(__logCat,__format,...)
do {
::dbg::LogCategory * const __catPtrVal = (::dbg::LogCategory *)(__logCat);
if( NULL != __catPtrVal && __catPtrVal->IsEnabled() )
{
__catPtrVal->Error( __format, __VA_ARGS__ );
}
} while( false )
在Visual Studio(2008)下,它可以按预期工作,即我可以同时执行TRACE_E( pLog, "some message without parameters" );
和TRACE_E( pLog, "some message with parameters %d %d", 4, 8 );
但是,当我在eclipse和Android NDK中使用同一个库时,如果我不在宏中的格式字符串后面传递至少一个参数,就会出现编译错误,即TRACE_E( pLog, "some message without parameters" );
无效,但TRACE_E( pLog, "some message without parameters", 0 );
有效,这迫使我在不需要任何参数的情况下传递一个伪参数。
当使用g++而不是Visual Studio的编译器时,可变宏的行为有什么不同吗?非常感谢。
是。您正在尝试的内容在标准C或C++中是不可能的。
这可以说是各自标准中的一个缺陷,不同的编译器有不同的解决方案。Visual Studio试图使其按原样工作,gcc和clang需要以下语法:
__catPtrVal->Error( __format, ##__VA_ARGS__ );
这里对gcc进行了描述;clang只是采用了gcc的做事方式。不幸的是,MSVC不理解这种语法。据我所知,在一般情况下,没有可移植的方法来解决这个问题。
不过,对于您的特定宏,您可以简单地编写
#define TRACE_E(__logCat,...)
do {
::dbg::LogCategory * const __catPtrVal = (::dbg::LogCategory *)(__logCat);
if( NULL != __catPtrVal && __catPtrVal->IsEnabled() )
{
__catPtrVal->Error(__VA_ARGS__ );
}
} while( false )
因为您使用__format
的唯一位置直接位于__VA_ARGS__
之前。
旁注:你在那里使用了很多保留的标识符。除非您正在编写一个标准的库实现,否则您应该更容易使用下划线。
相关文章:
- std::原子加载和存储都需要吗
- 需要帮助设置在C++中使用的Potrace
- 是否需要删除包含对象的"pair"?
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- C++我需要了解在哪里使用指针和双指针
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 当使用透明的std函数对象时,我们还需要写空的尖括号吗
- 我需要将多个函数组合为一个函数
- 概念中的cv限定符需要表达式参数列表
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- 需要从 istream 和 ostream 派生 iostream
- 我需要知道编译器如何在cpp中使用析构函数
- 为什么您需要C++头文件的包含保护
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 需要帮助将结构数组传递给函数
- Android-NDK-需要1+args的可变宏
- std::iter_swap 需要 ValueSwappable args vs std::swap 需要 Move A