带可变参数的宏写入文件,参数不识别是怎么回事?

jbz001 2019-06-24 08:33:23

#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <string.h>

using namespace std;


#define PRINTLOG(format, arg...) PrintTest(format, ##arg)

//#define WRITELOG(format, args...) WriteLog(format, ##args)
#define WRITELOG(Level, format, args...) WriteLog(Level, __FILE__, __LINE__, format, ##args)


void WriteLog(const string& strLevel, const string& strFile, int nLine, const char* format, ...)
//void WriteLog(const char* format, ...)
{
printf(format); // 输出不正常
printf("\n");

printf("%s\n", format); // 输出不正常

char aText[100] = { 0 };
sprintf(aText, "%s\n", format); // 输出不正常
printf(aText);

char aText2[100] = { 0 };
memcpy(aText2, format, strlen(format));
printf(aText2); // 输出不正常
printf("\n");
}

void PrintTest(const char* pText, ...)
{
printf(pText); // 输出正常
}

int main()
{
PRINTLOG("AAA%sBBB\n", "00000");
//WRITELOG("test %d", 12345);
WRITELOG("abc", "test %d", 12345);

return 0;
}



以下是输出结果:


上面是我的代码,我想用一个宏输出日志,并带上当前代码的文件名和行号,但是一直输出有问题。
不知道该怎么解决。
...全文
289 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
636f6c696e 2019-06-24
  • 打赏
  • 举报
回复
写了个完整例子:
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <stdarg.h>

using namespace std;


#define PRINTLOG(format, arg...) PrintTest(format, ##arg)

//#define WRITELOG(format, args...) WriteLog(format, ##args)
#define WRITELOG(Level, format, args...) WriteLog(Level, __FILE__, __LINE__, format, ##args)


void WriteLog(const char * strLevel, const char * strFile, int nLine, const char* format, ...)
//void WriteLog(const char* format, ...)
{   
    char aText[100] = {0};
    char aText2[100] = {0};
    
    va_list arg;
    va_start(arg, format);
    
    strcpy(aText, format);
    sprintf(aText, "[Level]:%s [File]:%s [Line]:%d %s\n", strLevel, strFile, nLine, format);
    //printf("%s\n", aText);    
    
    vsprintf(aText2, aText, arg);
    printf("%s", aText2);
    va_end(arg);
}

void PrintTest(const char* pText, ...)
{   
    printf(pText);    // 输出正常
}
 
int main()
{   
    PRINTLOG("AAA%sBBB\n", "00000");
    //WRITELOG("test %d", 12345);
    WRITELOG("abc", "test %d", 12345); 
    WRITELOG("ERROR", "test %d %s %d", 111, "abc", 222);
    
    return 0;
}
636f6c696e 2019-06-24
  • 打赏
  • 举报
回复
不定参必须用vsprintf,不能用sprintf,而且你完全没有用va_list对不定参进行处理。 仅供参考:
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <stdarg.h>

using namespace std;


#define PRINTLOG(format, arg...) PrintTest(format, ##arg)

//#define WRITELOG(format, args...) WriteLog(format, ##args)
#define WRITELOG(Level, format, args...) WriteLog(Level, __FILE__, __LINE__, format, ##args)


void WriteLog(const string& strLevel, const string& strFile, int nLine, const char* format, ...)
//void WriteLog(const char* format, ...)
{
    va_list arg;
    va_start(arg, format);
    char aText[100] = {0};
    vsprintf(aText, format, arg);
    printf("%s\n", aText);
    va_end(arg);
}

void PrintTest(const char* pText, ...)
{
    printf(pText);    // 输出正常
}

int main()
{
    PRINTLOG("AAA%sBBB\n", "00000");
    //WRITELOG("test %d", 12345);
    WRITELOG("abc", "test %d", 12345);

    return 0;
}

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧