- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个宏来简化 LOG4CPLUS 的使用。但是我在写宏的时候遇到了一些麻烦。
这是我的 cpp 文件中的内容:
Logger logger = Logger::getInstance("ManagerServer");
之后,我可以这样记录一行:
LOG4CPLUS_ERROR(logger, logEvent);
我只想写一个宏,而不是我可以将 logEvent 更改为一些变量参数。并像这样使用:
LogErr("failed");
LogErr("failed times %d", iTimes);
所以,我这样写:
#define LogErr(fmt, args...)\
do {\
char szBuf[MAX_LOG_BUFFER_SIZE];\
memset(szBuf, 0, MAX_LOG_BUFFER_SIZE); \
vsnprintf(szBuf, MAX_LOG_BUFFER_SIZE, fmt, ##args); \
LOG4CPLUS_ERROR(logger, szBuf);\
} while(0)
但是当我编译的时候。 g++ 给我这条信息:
error: expected primary-expression before ')' token
有人能帮帮我吗?我真的很感激。
最佳答案
糟糕... C 标签已被删除
问题出在没有提供足够参数时宏的扩展 (LogErr("failed")
)。这在 C 中不起作用。
尝试添加一个虚拟参数
LogErr("failed", 0);
/* or better */
LogErr("%s", "failed");
此外,您不能像您尝试的那样在宏中使用 v*
函数:预处理器不知道变量参数,也无法创建类型为 va_list
的对象>.
在 C99 中,一种实现您想要做的事情的方法是
#include <stdio.h>
#include <string.h>
#define MAX_LOG_BUFFER_SIZE 100
#define LogErr(fmt, ...) \
do { \
char szBuf[MAX_LOG_BUFFER_SIZE]; \
memset(szBuf, 0, MAX_LOG_BUFFER_SIZE); \
snprintf(szBuf, MAX_LOG_BUFFER_SIZE, fmt, ##__VA_ARGS__); \
/* LOG4CPLUS_ERROR(logger, szBuf); */ \
} while(0)
int main(void) {
LogErr("err %d", 4);
/*LogErr("failed");*/
LogErr("%s", "failed");
return 0;
}
注:snprintf
和##__VA_ARGS
关于c++ - 如何在宏中使用 vsprintf/vsnprintf?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6478072/
我有以下代码,并试图理解为什么 vsnprintf 会导致格式字符串漏洞。 如果我执行如下程序“./test %llx”,这个漏洞是否是因为“%llx”被传入va_list,然后被vsprintf解释
我正在尝试使用 TI C2000 微 Controller 在 TFT 显示器上显示格式化字符串。为了实现这一点,我使用了以下函数。 void text_writeFormatAtPoint(font
是否可以使用 vsnprintf 从数组中的确切值开始打印?例如,我想使用 vsnprintf 从数组中的第 25 个字符开始打印。我可以只输入这段代码吗? va_list args; #define
我有以下功能: void printerror(char *fmt, ...) { char string[256]; va_list str; va_start(str, f
带有 myPrint() 函数的超长字符串将会崩溃。 我认为 vsnprintf() 无法从 linux 手册页返回超过缓冲区长度的写入大小。 我预期的字符串是缓冲区大小的截断字符串,但这在下面的测试
我正在将一些非常古老(> 10y)的 C 代码移植到现代 Linux。我在自定义编写的 vsnprintf() 包装器中遇到了段错误(显然它的任务是检测重复的输出字符串并保留它们): char* st
我正在编写需要格式化字符串的代码,我想避免缓冲区溢出。 我知道如果 vsnprintf 可用(从 C99 开始)我们可以: char* formatString(const char *format,
我正在尝试编写一个宏来简化 LOG4CPLUS 的使用。但是我在写宏的时候遇到了一些麻烦。 这是我的 cpp 文件中的内容: Logger logger = Logger::getInstance("
我在 ubuntu 12.04 上,使用 uname -a:Linux lu057801 3.2.0-31-generic#50-Ubuntu SMP Fri Sep 7 16:16:45 UTC 2
在实现一个简单的 printf 样式记录器时,我遇到了 vsnprintf 崩溃。这就是我调用记录器实用程序的方式: LoggerUtil->LogInfo("Whatever info here %
以下代码将在 Visual Studio 2012 上给出预期结果,但在 XCode 5.0 上不会。我想念什么? static std::string format(const std::strin
我正在重写一些代码以与 32 位和 64 位架构兼容,但我在调用 vsnprintf 时遇到了问题。 vsnprintf 似乎没有在任一架构上正确处理来自 inttypes.h 的固定大小整数类型。
我有以下声明: vsnprintf(target, size - 1, "%ls_%ls", str16_1, str16_2); 为什么这在 gcc 上失败了? 我在 Windows 上是这样使用的
我目前正在将 C 头文件翻译成 delphi。 delphi中有没有函数可以代替C语言的vsnprintf?或者它是否存在于任何常见的 DLL 中? int vsnprintf(char *str,
vsnprintf() 能否返回一个大于 1 的负值?如果是,它是在什么情况下这样做的? 我尝试使用 %ls 作为 char 数组的格式说明符,还尝试复制大于分配的数组。在这两种情况下,我都得到 -1
我有一个大小为 N 的 char 数组,我需要在不同部分获取 vsnprintf 输出,以防其长度超过 char 数组大小减去 1(N-1 字节)。 我想实现类似 printf 的东西,但通过 UAR
我看过这个question以及这些 PDF 的 1和 2 , 这个page并且非常了解如果我这样做会发生什么 printf(SOME_TEST_STRING)。但我不明白的是,与 vsprintf 相
我有以下功能: void raiseError(const char *msg, ...) { va_list ap; va_start(ap, msg); // use variab
vsnprintf 的预期行为是什么?当它有一个输入 NULL 字符串和/或 size=0 时,例如 vsnprintf(NULL, 0, "%d", p); 或者 vsnprintf(NULL, 1
我的代码如下: #include #include #include int test(const char *fmt, ...); int main(void) { int i
我是一名优秀的程序员,十分优秀!