[英]C function always returns zero to Objective C
我有一個 Objective C 項目,其中包含一個帶有一些幫助函數的 C 文件。 但是,C 文件中返回float
函數沒有按預期工作。
C文件:
float returnFloat() {
return 10.0;
}
同時在Objective C實例方法中:
float x;
x = returnFloat();
x 始終為 0.000000。
編輯
我在目標 C 文件中有一堆“隱式聲明”警告,這些警告與我在 C 文件中的函數的使用有關。
使用返回int
函數的賦值工作正常。 在從返回float
的函數進行賦值的情況下,調試器會說“編譯器優化掉的變量”。
我可能沒有在 Objective-C 代碼中正確導入 C 文件嗎? 我只是讓 Xcode 自動鏈接它。 那么,為什么只有返回float
C 函數才會出現問題?
您必須使用 .h 文件,就像使用 .m 文件一樣,在另一個文件中聲明您正在執行的操作。 因此,對於這種情況,您需要這樣的東西(這些是不完整的):
返回浮動.c
float returnFloat() {
return 10.0;
}
返回浮動.h
float returnFloat(void);
使用float.m
#import "returnfloat.h"
- (void) someMethod {
float ten = returnFloat();
}
問題(由您的“隱式聲明”警告給出)是編譯器假設您正在調用返回int
或id
東西,而不是float
。 當您使用 C 時,需要對事物進行原型設計(GCC 會將 .c 文件視為 C,並且所有 C 規則都適用,即使您在 Objective-C 項目中)。
如果你想看一個例子,這里是我的一個項目中的一些東西——生產代碼(你可以在以 .m 結尾的文件中編寫純 C,GCC 在某些方面會像對待 Objective-C 一樣對待它):
調試文件
#import "DebugF.h"
void __Debug(const char *file, int line, NSString *format, ...) {
#ifdef DEBUG
/* Wraps NSLog() with printf() style semantics */
#endif
}
調試文件
#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"
這是因為你想要:
// 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代碼中使用)。
對不起,如果我誤解了你的問題,我很確定我的代碼是正確的:)
編輯:澄清所有反對者。 在他對帖子的第一次修訂中,他將它設為 float returnFloat {} 而不是 float returnFloat() { },這促使我回答。
編輯 2 :顯然這還不夠清楚。 在他對帖子的第一次修訂中,他將編寫函數原型的 C 方式與編寫函數原型的 Objective-C 方式混合在一起。 你可以在 Objective-C 中使用 C 函數,但你不能混合編寫它們的函數原型的方式,正如我上面解釋的那樣。 很抱歉有任何混淆。
您是如何向 Objective-C 程序聲明“returnFloat()”的? 它在范圍內有原型嗎? 如果不是,那么您可能的問題是,Objective-C 將該函數視為返回一個 int 而不是一個浮點數,並且會造成嚴重破壞(或者您認為返回了零)。
你如何確定x
是0.0000
? 調試中的一個常見錯誤是在NSLog()
使用了錯誤的格式字符串。
如果您是,使用NSLog()
,請確保您使用的是%f
或它的某些變體:
NSLog(@"x = %f", x);
(許多人混淆並嘗試使用%i
代替)
編輯:這是假設你的 C 函數原型是正確的,缺少括號只是這里的一個錯字。 如果不是,Blaenk 的回答可能是正確的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.