我声明宏可以很容易地复制写入文件Log的逻辑 我最终收到错误C2065:'flog':未声明的标识符。 但我没有得到log_buffer的这个错误。
我正在使用Visual Studios 2008 IDE。
我做错了什么?
#ifndef ERROR_LOG_MACRO
#define ERROR_LOG_MACRO 1
#define SETERRORPARAMS char log_buffer[MAX_PATH]; \
char flog[MAX_PATH]; \
FILE *err_log_fp;
/*
Arguments: x (Name of the File)
y (File Path without the Filename)
z (Mode)
*/
#define OPENFILE(x,y,z) strcpy(flog,y); \
strcat(flog,"\\"); \
strcat(flog,x); \
err_log_fp = fopen(flog, z);
#define WRITELOG(x) if(err_log_fp) \
fwrite(log_buffer, sizeof(char), strlen(log_buffer), err_log_fp);
#define CLOSEFILE if(err_log_fp) \
fclose(err_log_fp);
#endif
我甚至试图做
#define OPENFILE(x,y,z) SETERRORPARAMS \
... \
但即使这样也行不通。
答案 0 :(得分:1)
在您使用flog
宏的任何地方,您实际检查 OPENFILE
是否在范围内?
例如代码段:
SETERRORPARAMS
OPENFILE (fileStr, pathStr, modeStr)
最糟糕的情况是,您必须在预处理器完成其工作后检查代码。大多数编译器都会让您检查该预处理器阶段产生的输出。 GCC会使用gcc -E
,但我不确定与MSVC相同的是什么。
This link似乎表明您可以在项目设置中输入/P
,以便将预处理的文件写入*.i
个文件。
但是,我必须这样说,使用宏来实现这个并不是一个好主意。在过去,它曾经很好地用于速度目的,但在这些日子里,内联函数和非常好的代码优化器并不是必需的。
答案 1 :(得分:1)
您可能在宏的第一行之后有尾随空格:
#define SETERRORPARAMS char log_buffer[MAX_PATH]; \______ <-- make sure you have no whitespaces
char flog[MAX_PATH]; \
FILE *err_log_fp;
要么就是这样,要么你没有使用宏,log_buffer
在别处宣布。