Макро декларация с ошибками - PullRequest
0 голосов
/ 06 февраля 2012

Я объявляю макросы, которые упрощают копирование логики записи в файл. Я получаю сообщение об ошибке 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 \ 
                          ... \

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

Ответы [ 2 ]

1 голос
/ 06 февраля 2012

Возможно, после первой строки вашего макроса у вас есть пробельные символы:

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

Либо так, либо вы не используете макрос, а log_buffer объявлено в другом месте.

1 голос
/ 06 февраля 2012

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

Например, с сегментом кода:

SETERRORPARAMS
OPENFILE (fileStr, pathStr, modeStr)

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

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

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

...