用宏C编程返回

用宏C编程返回,c,macros,return,C,Macros,Return,即使fopen()函数已成功执行,此代码始终返回-1。有什么我忽略的吗 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

即使fopen()函数已成功执行,此代码始终返回-1。有什么我忽略的吗

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;
}
谢谢

\define
是一个预处理器命令,这意味着它不是在函数
nullCheck()
中计算/处理的,而是在编译代码之前。因此总是定义
\u NULL\u ERROR
,因此条件

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

将始终导致预编译器添加
返回-1到您的代码。

Oy va voy!宏是在编译代码时定义和未定义的,而不是在代码运行时!它们不受“if”和“then”等控制流语句的影响——它们都是在编译这些语句之前处理的

您需要重新阅读C预处理器上的文档。调用nullCheck时不会执行
#define _NULL_ERROR
,在编译文件之前,预处理器处理文件时会对其进行解释。因此,您总是设置
\u NULL\u ERROR
,因此您总是返回-1。

\define
\ifdef
,而朋友的工作方式与您想象的不同。它们甚至在编译器看到代码之前就影响了代码。让您的编译器在编译之前向您显示预处理的源代码(
-E
-save_temps
在gcc和clang中),您将立即看到正在发生的事情。

在预处理器运行后,您的代码在编译器看来就是这样的:

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;
}

如上所述,预处理器在编译器运行之前处理宏。

4个答案大约在五分钟内完成-太棒了!好吧,你们都是对的,我忘了我的基本知识!:)谢谢大家。从某种意义上说,一切都是对的,但您已经付出了努力来显示代码。:)