Возврат с программированием Macro C - PullRequest
0 голосов
/ 21 марта 2011

Этот код всегда возвращает -1, даже если функция fopen () выполнена успешно. Есть ли что-то, что я игнорирую.

void nullCheck(FILE* checkVar)  {
    if(checkVar==NULL)  {
        #define _NULL_ERROR
      }
    }

int readFile(char* _name, char* storeArray) {
FILE* fp;
fp=fopen(_name,READ_ONLY_MODE);
nullCheck(fp);
#ifndef _NULL_ERROR
    char c=0;
    while((c=getc(fp))!=EOF) {
        *(storeArray+i)=c;
        i+=1;
    }
#endif
#ifdef _NULL_ERROR
    #undef _NULL_ERROR
    return -1;
#endif
return 1;
}

Спасибо! * * 1004

Ответы [ 5 ]

5 голосов
/ 21 марта 2011

Ой ва вой!Макросы определяются и не определяются при компиляции кода, не при запуске!На них не влияют операторы потока управления, такие как «if» и «then» - все они обрабатываются до того, как даже начинается компиляция этих операторов!

3 голосов
/ 21 марта 2011

Вам необходимо перечитать документацию по препроцессору C. #define _NULL_ERROR не выполняется при вызове nullCheck, оно прерывается, когда препроцессор обрабатывает файл перед его компиляцией. Таким образом, вы всегда устанавливаете _NULL_ERROR, и поэтому вы всегда будете возвращать -1.

2 голосов
/ 21 марта 2011

#define - команда препроцессора, что означает, что она не рассчитывается / не обрабатывается в функции nullCheck(), а до компиляции кода. поэтому _NULL_ERROR всегда определяется и, следовательно, условие

#ifdef _NULL_ERROR
    #undef _NULL_ERROR
    return -1;
#endif

всегда заставит прекомпилятор добавить return -1; в ваш код.

1 голос
/ 21 марта 2011

Вот как ваш код выглядит компилятором после запуска препроцессора:

void nullCheck(FILE* checkVar)  {
    if(checkVar==NULL)  {
      }
    }

int readFile(char* _name, char* storeArray) {
FILE* fp;
fp=fopen(_name,READ_ONLY_MODE);
nullCheck(fp);
    return -1;
return 1;
}

Как было сказано выше, препроцессор работает с макросами до запуска компилятора.

1 голос
/ 21 марта 2011

#define, #ifdef, а друзья не работают так, как вы думаете.Это директивы препроцессора , которые влияют на ваш код еще до того, как компилятор его увидит.Пусть ваш компилятор покажет вам предварительно обработанный исходный код перед его компиляцией (-E или -save_temps в gcc и clang), и вы сразу увидите, что происходит.

...