2012-02-06 56 views
0

我声明了宏,它可以很容易地复制写入文件的逻辑Log 我最终得到错误C2065:'flog':未声明的标识符。 但是我没有得到log_buffer的这个错误。宏声明给出的错误

我正在使用Visual Studio 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 \ 
          ... \ 

但是,即使这没有奏效。

+1

你可以显示它失败的功能吗? – MByD 2012-02-06 12:36:46

+1

为什么你使用这个宏?为什么不正确地实施这个功能? – 2012-02-06 12:38:54

回答

1

你可能有尾部空格宏的第一行后:

#define SETERRORPARAMS char log_buffer[MAX_PATH]; \______ <-- make sure you have no whitespaces 
        char flog[MAX_PATH]; \ 
        FILE *err_log_fp; 

要么,你不使用宏和log_buffer在别处声明。

+0

白色的空间造成的问题:( – nimish 2012-02-06 14:24:24

+0

它是多余的字符? – 2012-02-06 14:24:38

+0

是啊,我去过那里:)。 – 2012-02-06 14:24:56

1

您是否确实已检查flog是否在您使用OPENFILE宏的范围内?

如与代码段:

SETERRORPARAMS 
OPENFILE (fileStr, pathStr, modeStr) 

最坏的情况,你必须检查代码的预处理器完成工作后。大多数编译器会让您检查该预处理器阶段产生的输出。海湾合作委员会将使用gcc -E,但我不知道是什么相当于MSVC。

This link似乎表明您可以在项目设置中输入/P以将预处理过的文件写入*.i文件。

但是,我不得不说,使用宏这不是一个好主意。在过去,它过去对速度有好处,但在内联函数和非常好的代码优化器的这些日子里并不是真的需要。

+0

好的。我会尽力实现你的建议。谢谢:) – nimish 2012-02-06 14:27:24