C函数始终向目标C返回零

我有一个Objective C项目,它包含一个带有一些辅助函数的C文件。 我试图从C文件中返回float s时遇到严重且非常恼人的问题。

C档案:

 float returnFloat() { return 10.0; } 

同时在Objective C实例方法中:

 float x; x = returnFloat(); 

x始终为0.000000。 我有什么想法我做错了吗?

编辑

好的,我已经意识到我在Objective C文件中有一堆“隐式声明”警告,与我在C文件中使用的函数有关。

使用返回int的函数的赋值工作正常。 如果赋值是从返回float的函数中进行的,则调试器会说“变量被编译器优化掉”。

是不是我可能没有使用“正确”的方法在Objective C项目中包含一个包含辅助函数的C文件? 我(愚蠢地?)让Xcode自动链接它。 即使如此,为什么只有在函数返回float时才会出现此问题?

您必须使用.h文件,就像使用.m文件一样,声明您在另一个文件中执行的操作。 所以,你需要这样的场景(这些是不完整的):

returnfloat.c

 float returnFloat() { return 10.0; } 

returnfloat.h

 float returnFloat(void); 

usefloat.m

 #import "returnfloat.h" - (void) someMethod { float ten = returnFloat(); } 

问题(由“隐式声明”警告提供)是编译器假设您正在调用返回intid东西,而不是float 。 当您使用C时,需要对事物进行原型化(GCC会将.c文件视为C,并且所有C规则都适用,即使您在Objective-C项目中也是如此)。


如果你想看一个例子,这是我的一个项目中的东西 – 生产代码(你可以在以.m结尾的文件中编写纯C,GCC会在某些方面将其视为Objective-C):

DebugF.m

 #import "DebugF.h" void __Debug(const char *file, int line, NSString *format, ...) { #ifdef DEBUG /* Wraps NSLog() with printf() style semantics */ #endif } 

DebugF.h

 #ifndef __DEBUGF_H_INCLUDED__ #define __DEBUGF_H_INCLUDED__ #ifdef DEBUG #define DebugF(args...) __Debug(__FILE__, __LINE__, args) #else #define DebugF(...) #endif /* DEBUG */ void __Debug(const char *file, int line, NSString *fmt, ...); #endif /* __DEBUGF_H_INCLUDED */ 

SomeViewController.m

 DebugF(@"Got these arguments: %u, %@, %@", 4, anObject, [anObject somethingElse]); 

我不是Objective-C程序员,但在C世界中,编译器假定当前模块使用的任何未声明函数的int返回类型。 在我看来,创建一个普通的C头文件包含:

 #ifndef _MY_IMPORTANT_HEADER_ #define _MY_IMPORTANT_HEADER_ extern float returnFloat(); #endif 

并将其包含在您的.m文件中应该使它全部工作:

 #include "myheader.h" 

你是如何向Objective-C程序声明’returnFloat()’的? 它的范围是原型吗? 如果没有,那么你可能的问题是Objective-C将函数视为返回一个int而不是一个浮点数,并且随后发生了破坏(或者你认为返回了零)。

这是你想要的原因:

 // the c way float returnFloat() { return 10.0; } float result = returnFloat(); // the objective-c way - (float) returnFloat { return 10.0; } float result = [self returnFloat]; // assuming this is an object 

不是你拥有的。 您正在将C函数原型与Objective-C混合使用。 尝试上面提到的C方式(应该能够在Objective-C代码中使用它)。

对不起,如果我误解了你的问题,我很确定我的代码是正确的:)

编辑 :澄清所有的downvoters。 在他对post的第一次修订中,他使它浮动returnFloat {}而不是float returnFloat(){},这促使我回答。

编辑2 :显然这还不够清楚。 在他的第一次修订中,他将编写函数原型的C方式与Objective-C编写函数原型的方式混合在一起。 你可以在Objective-C中使用C函数,但是你不能混合编写函数原型的方法,正如我在上面解释的那样。 对不起任何困惑。

你怎么确定x0.0000 ? 调试中常见的错误是在NSLog()使用错误的格式字符串。

如果您使用NSLog() ,请确保使用%f或其某些变体:

 NSLog(@"x = %f", x); 

(很多人混淆了并尝试使用%i代替)

编辑:这是假设你的C函数原型是正确的,缺少括号只是一个错字。 如果没有,Blaenk的答案可能是正确的。