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

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;
}



以下是输出结果:


上面是我的代码,我想用一个宏输出日志,并带上当前代码的文件名和行号,但是一直输出有问题。
不知道该怎么解决。
...全文
316 2 打赏 收藏 转发到动态 举报
写回复
用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;
}
五次多项式换道转向避撞轨迹规划可视化Matlab代码(分析不同车速与路面附着系数对换道时间、距离及横向加速度的影响)内容概要:本文介绍了一套基于五次多项式插值的换道转向避撞轨迹规划方法,并提供了完整的Matlab可视化代码实现。该方法用于自动驾驶或智能车辆在紧急避障场景下的平滑轨迹生成,重点分析了不同初始车速与路面附着系数对换道过程的影响,包括换道所需时间、行驶距离及横向加速度的变化规律,从而评估轨迹的安全性与舒适性。文中通过仿真展示了在多种工况下轨迹的动态特性,帮助理解车辆动力学约束与路面条件对路径规划的影响。; 适合人群:具备一定车辆动力学基础和Matlab编程能力的研究生、科研人员及从事自动驾驶路径规划的工程技术人员。; 使用场景及目标:①研究自动驾驶车辆在避障换道过程中的轨迹生成与优化;②分析车速与路面摩擦系数对换道性能(如时间、距离、横向加速度)的影响;③为智能驾驶系统提供可验证的轨迹规划算法原型与仿真平台; 阅读建议:建议结合Matlab代码逐段运行并调整参数(如车速、附着系数),观察仿真结果变化,深入理解五次多项式在横向轨迹规划中的应用优势与局限,同时可扩展至更复杂的动态环境或多车协同场景。
基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究(Matlab代码实现)内容概要:本文围绕“基于数据驱动的Koopman算子的递归神经网络模型线性化”展开,旨在研究纳米定位系统的预测控制方法。通过结合数据驱动技术与Koopman算子理论,将非线性系统动态近似为高维线性系统,进而利用递归神经网络(RNN)建模并实现系统行为的精确预测。文中详细阐述了模型构建流程、线性化策略及在预测控制中的集成应用,并提供了完整的Matlab代码实现,便于科研人员复现实验、优化算法并拓展至其他精密控制系统。该方法有效提升了纳米级定位系统的控制精度与动态响应性能。; 适合人群:具备自动控制、机器学习或信号处理背景,熟悉Matlab编程,从事精密仪器控制、智能制造或先进控制算法研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①实现非线性动态系统的数据驱动线性化建模;②提升纳米定位平台的轨迹跟踪与预测控制性能;③为高精度控制系统提供可复现的Koopman-RNN融合解决方案; 阅读建议:建议结合Matlab代码逐段理解算法实现细节,重点关注Koopman观测矩阵构造、RNN训练流程与模型预测控制器(MPC)的集成方式,鼓励在实际硬件平台上验证并调整参数以适应具体应用场景。

65,206

社区成员

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

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