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

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



以下是输出结果:


上面是我的代码,我想用一个宏输出日志,并带上当前代码的文件名和行号,但是一直输出有问题。
不知道该怎么解决。
...全文
306 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;
}
The C programming Language 第二版英文版 內容列表 Table of Contents Preface.......................................................... Preface to the first edition..................................... Introduction..................................................... Chapter 1 - A Tutorial Introduction.............................. 1.1 Getting Started................................ 1.2 Variables and Arithmetic Expressions........... 1.3 The for statement.............................. 1.4 Symbolic Constants............................. 1.5 Character Input and Output..................... 1.5.1 File Copying.......................... 1.5.2 Character Counting.................... 1.5.3 Line Counting......................... 1.5.4 Word Counting......................... 1.6 Arrays......................................... 1.7 Functions...................................... 1.8 Arguments - Call by Value...................... 1.9 Character Arrays............................... 1.10 External Variables and Scope.................. Chapter 2 - Types, Operators and Expressions..................... 2.1 Variable Names................................. 2.2 Data Types and Sizes........................... 2.3 Constants...................................... 2.4 Declarations................................... 2.5 Arithmetic Operators........................... 2.6 Relational and Logical Operators............... 2.7 Type Conversions............................... 2.8 Increment and Decrement Operators.............. 2.9 Bitwise Operators.............................. 2.10 Assignment Operators and Expressions.......... 2.11 Conditional Expressions....................... 2.12 Precedence and Order of Evaluation............ Chapter 3 - Control Flow......................................... 3.1 Statements and Blocks.......................... 3.2 If-Else........................................ 3.3 Else-If........................................ 3.4 Switch......................................... 3.5 Loops - While and For.......................... 3.6 Loops - Do-While............................... 3.7 Break and Continue............................. 3.8 Goto and labels................................ Chapter 4 - Functions and Program Structure...................... 4.1 Basics of Functions............................ 4.2 Functions Returning Non-integers............... 4.3 External Variables............................. 4.4 Scope Rules.................................... 4.5 Header Files................................... 4.6 Static Variables................................ 4.7 Register Variables.............................. 4.8 Block Structure................................. 4.9 Initialization.................................. 4.10 Recursion...................................... 4.11 The C Preprocessor............................. 4.11.1 File Inclusion........................ 4.11.2 Macro Substitution.................... 4.11.3 Conditional Inclusion................. Chapter 5 - Pointers and Arrays.................................. 5.1 Pointers and Addresses......................... 5.2 Pointers and Function Arguments................ 5.3 Pointers and Arrays............................ 5.4 Address Arithmetic............................. 5.5 Character Pointers and Functions............... 5.6 Pointer Arrays; Pointers to Pointers........... 5.7 Multi-dimensional Arrays....................... 5.8 Initialization of Pointer Arrays............... 5.9 Pointers vs. Multi-dimensional Arrays.......... 5.10 Command-line Arguments........................ 5.11 Pointers to Functions......................... 5.12 Complicated Declarations...................... Chapter 6 - Structures........................................... 6.1 Basics of Structures........................... 6.2 Structures and Functions....................... 6.3 Arrays of Structures........................... 6.4 Pointers to Structures......................... 6.5 Self-referential Structures.................... 6.6 Table Lookup................................... 6.7 Typedef........................................ 6.8 Unions......................................... 6.9 Bit-fields..................................... Chapter 7 - Input and Output..................................... 7.1 Standard Input and Output....................... 7.2 Formatted Output - printf....................... 7.3 Variable-length Argument Lists.................. 7.4 Formatted Input - Scanf......................... 7.5 File Access..................................... 7.6 Error Handling - Stderr and Exit................ 7.7 Line Input and Output........................... 7.8 Miscellaneous Functions......................... 7.8.1 String Operations...................... 7.8.2 Character Class Testing and Conversion. 7.8.3 Ungetc................................. 7.8.4 Command Execution...................... 7.8.5 Storage Management..................... 7.8.6 Mathematical Functions................. 7.8.7 Random Number generation............... Chapter 8 - The UNIX System Interface............................ 8.1 File Descriptors............................... 8.2 Low Level I/O - Read and Write................. 8.3 Open, Creat, Close, Unlink..................... 8.4 Random Access - Lseek.......................... 8.5 Example - An implementation of Fopen and Getc.. 8.6 Example - Listing Directories.................. 8.7 Example - A Storage Allocator.................. Appendix A - Reference Manual.................................... A.1 Introduction................................... A.2 Lexical Conventions............................ A.2.1 Tokens................................ A.2.2 Comments.............................. A.2.3 Identifiers........................... A.2.4 Keywords.............................. A.2.5 Constants............................. A.2.6 String Literals....................... A.3 Syntax Notation................................ A.4 Meaning of Identifiers......................... A.4.1 Storage Class......................... A.4.2 Basic Types........................... A.4.3 Derived types......................... A.4.4 Type Qualifiers....................... A.5 Objects and Lvalues............................ A.6 Conversions.................................... A.6.1 Integral Promotion.................... A.6.2 Integral Conversions.................. A.6.3 Integer and Floating.................. A.6.4 Floating Types........................ A.6.5 Arithmetic Conversions................ A.6.6 Pointers and Integers................. A.6.7 Void.................................. A.6.8 Pointers to Void...................... A.7 Expressions.................................... A.7.1 Pointer Conversion.................... A.7.2 Primary Expressions................... A.7.3 Postfix Expressions................... A.7.4 Unary Operators....................... A.7.5 Casts................................. A.7.6 Multiplicative Operators.............. A.7.7 Additive Operators.................... A.7.8 Shift Operators....................... A.7.9 Relational Operators.................. A.7.10 Equality Operators................... A.7.11 Bitwise AND Operator................. A.7.12 Bitwise Exclusive OR Operator........ A.7.13 Bitwise Inclusive OR Operator........ A.7.14 Logical AND Operator................. A.7.15 Logical OR Operator.................. A.7.16 Conditional Operator................. A.7.17 Assignment Expressions............... A.7.18 Comma Operator.......................... A.7.19 Constant Expressions.................... A.8 Declarations..................................... A.8.1 Storage Class Specifiers................. A.8.2 Type Specifiers.......................... A.8.3 Structure and Union Declarations......... A.8.4 Enumerations............................. A.8.5 Declarators.............................. A.8.6 Meaning of Declarators................... A.8.7 Initialization........................... A.8.8 Type names............................... A.8.9 Typedef.................................. A.8.10 Type Equivalence........................ A.9 Statements....................................... A.9.1 Labeled Statements....................... A.9.2 Expression Statement..................... A.9.3 Compound Statement....................... A.9.4 Selection Statements..................... A.9.5 Iteration Statements..................... A.9.6 Jump statements.......................... A.10 External Declarations........................... A.10.1 Function Definitions.................... A.10.2 External Declarations................... A.11 Scope and Linkage............................... A.11.1 Lexical Scope........................... A.11.2 Linkage................................. A.12 Preprocessing................................... A.12.1 Trigraph Sequences...................... A.12.2 Line Splicing........................... A.12.3 Macro Definition and Expansion.......... A.12.4 File Inclusion.......................... A.12.5 Conditional Compilation................. A.12.6 Line Control............................ A.12.7 Error Generation........................ A.12.8 Pragmas................................. A.12.9 Null directive.......................... A.12.10 Predefined names....................... A.13 Grammar......................................... Appendix B - Standard Library.................................... B.1.1 File Operations................................ B.1.2 Formatted Output......................... B.1.3 Formatted Input.......................... B.1.4 Character Input and Output Functions..... B.1.5 Direct Input and Output Functions........ B.1.6 File Positioning Functions............... B.1.7 Error Functions.......................... B.2 Character Class Tests: ................. B.3 String Functions: ..................... B.4 Mathematical Functions: ................. B.5 Utility Functions: ....................

65,199

社区成员

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

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