宏声明给出错误

时间:2012-02-06 12:30:59

标签: c macros compiler-errors

我声明宏可以很容易地复制写入文件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 \ 
                          ... \

但即使这样也行不通。

2 个答案:

答案 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在别处宣布。

相关问题