2011-03-21 43 views
0

即使fopen()函数成功执行,此代码始终返回-1。有什么我是无视的。使用宏C编程返回

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

谢谢!

+0

4分钟左右回答 - 非常棒! – check123 2011-03-21 15:08:25

+0

好吧,你们都是对的,我忘了我的基本知识! :) 感谢大家。 – check123 2011-03-21 15:08:47

回答

1

这是你的代码是什么样的编译器,预处理器运行后:

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

正如上面所陈述的,预处理涉及编译器运行之前的宏。

+0

从某种意义上说,所有的都是正确的,但你已经努力展示代码。 :) – check123 2011-03-21 15:19:11

2

#define是一个预处理器命令,这意味着它不在函数nullCheck()中计算/处理,但在编译代码之前。所以_NULL_ERROR始终定义,因此条件

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

总会引起预编译的return -1;添加到您的代码。

5

Oy va voy!当你的代码被编译时,宏被定义和undefined,当它运行时,不是!它们不受像“if”和“then”这样的控制流程语句的影响 - 它们在编译这些语句之前都会被处理,甚至开始!

3

您需要重新阅读有关C预处理器的文档。当调用nullCheck时,#define _NULL_ERROR不会被执行,当预编译器在编译之前处理该文件时,它会得到处理。所以你总是设置_NULL_ERROR,所以你总是会返回-1。

1

#define,#ifdef,和朋友不像你认为他们那样工作。它们是preprocessor directives甚至在编译器看到它之前就会影响你的代码。让您的编译器在编译之前向您显示预处理的源代码(在gcc和clang中为-E-save_temps),您将立即看到发生了什么。