用宏C编程返回
即使fopen()函数已成功执行,此代码始终返回-1。有什么我忽略的吗用宏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
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个答案大约在五分钟内完成-太棒了!好吧,你们都是对的,我忘了我的基本知识!:)谢谢大家。从某种意义上说,一切都是对的,但您已经付出了努力来显示代码。:)