将浮点值从目标C传递到C++方法

Passing float values from objective C to C++ methods

本文关键字:C++ 方法 目标      更新时间:2023-10-16

我正在从Objective C调用一个C++方法。我需要传递一个浮点值作为参数。这是代码:

c++方法:

void printValue(float a){ 
         NSLog(@"Value of a: %5.2f",a);  // I am using NSLog here. It works
}

我在C++文件中有指令extern"C"。也对c++文件使用.mm扩展名

我从Objective C类中这样调用这个方法:

printValue(3.1); // 3.1 is a sample value

我得到了Value of a: 0.00。如果我将(float a)更改为(double a),我会得到正确的值3.10。

调用时,我尝试将值强制转换为浮点值

printValue((float)3.1);

这也给出0.00

我该如何解释?

C的调用约定规定,当将参数传递给变参数函数(像NSLog这样的函数,在参数列表的末尾带有…)时,每个float都必须转换并作为double传递。

我预计C++的情况并非如此(但我真的不知道)。无论如何,由于NSLog期望所有浮点类型都是双倍的,所以显式进行转换是最安全的:

NSLog(@"Value of a: %5.2f", (double)a);

另一个想法是:如果编译器说缺少关于NSLog的函数声明,那么问题也可能是它没有像变参数所期望的那样转换为double,因为它没有看到函数的声明。