2012-02-06 4 views
0

Я объявляю макросы, которые облегчат репликацию логики записи в файл. Журнал В итоге я получаю сообщение об ошибке C2065: «flog»: uneclared identifier. Но я не получаю эту ошибку для 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 \ 
          ... \ 

Но даже это не сработало.

+1

Вы можете показать функцию, в которой он не работает? – MByD

+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 объявлен в другом месте.

+0

The White Spaces вызывают проблему :( – nimish

+0

Были ли дополнительные символы? –

+0

Да, я был там :). –

1

У вас есть проверено, что flog есть в области, где вы используете макрос OPENFILE?

Такие, как с сегментом кода:

SETERRORPARAMS 
OPENFILE (fileStr, pathStr, modeStr) 

В худшем случае, вы должны изучить код после того, как препроцессор сделал свою работу. Большинство компиляторов позволят вам просмотреть результат, полученный на этом этапе препроцессора. GCC будет использовать gcc -E, но я не уверен, что эквивалентно MSVC.

This link, похоже, указывает, что вы можете ввести /P в настройки проекта, чтобы получить файлы с предварительным воспроизведением, записанные в файлы *.i.

Но, я должен сказать это, используя макросы для этого, это не очень хорошая идея. Раньше это было хорошо для скоростных целей, но в наши дни встроенные функции и очень хорошие оптимизаторы кода не нужны.

+0

Хорошо. Я постараюсь реализовать то, что вы предложили. Спасибо :) – nimish

Смежные вопросы