簡體   English   中英

C 函數總是向目標 C 返回零

[英]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();
}

問題(由您的“隱式聲明”警告給出)是編譯器假設您正在調用返回intid東西,而不是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 而不是一個浮點數,並且會造成嚴重破壞(或者您認為返回了零)。

你如何確定x0.0000 調試中的一個常見錯誤是在NSLog()使用了錯誤的格式字符串。

如果您是,使用NSLog() ,請確保您使用的是%f或它的某些變體:

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

(許多人混淆並嘗試使用%i代替)

編輯:這是假設你的 C 函數原型是正確的,缺少括號只是這里的一個錯字。 如果不是,Blaenk 的回答可能是正確的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM