2013-03-13 47 views
0

尽管我在Cocoa开发了多年,但我从来没有必要开发一种用于处理非对象变量的C风格的库。关于可可C风格功能的一些愚蠢的问题

我称之为 “C风格的功能”,例如:

float myCStyleFunction(float var1, float var2); 

知道的Objective-C是C的后代,我试图做一个真正的C函数。但是一些简单的东西是编译器不允许的。

一通按引用:

void makeSomethingWithImages(CGImageRef & im1, CGImageRef & im1); 

这不起作用。 Compilator说Parameter name omitted有没有办法通过引用我的CGImages?

其次,默认参数:

void makeSomethingWithImages(CGImageRef im1, CGImageRef im1, float tolerance) { ... } 

void makeSomethingWithImages(CGImageRef im1, CGImageRef im1) { 
    makeSomethingWithImages(im1, im2, 0); 
} 

错误:Conflicting types for 'makeSomethingWithImages'

有没有办法有一些默认的参数?

而附属问题:如果Obj-C是C后代,为什么这些示例不起作用?

回答

4

通过引用传递的是C++ not c,所以默认参数和函数重载,尽管clang为函数重载增加了c的扩展,但是还有其他语法。

+0

With'void makeSomethingWithImages(CGImageRef im1,CGImageRef im1)',是函数调用时复制的参数吗? – Martin 2013-03-13 10:19:02

+0

@Martin是的。避免这种情况的唯一方法是发送指针。引用会很好,但Objective-C不支持它。顺便提一下,'CGImageRefs'已经是指针了,所以拷贝的数量是最小的。 – Ephemera 2013-03-13 10:24:11

+0

哦,是的,他们是指针,你是对的。你有关于我的第二个问题的解释(不同的函数签名有冲突),还是一样的:仅在C++中可用? – Martin 2013-03-13 10:28:19

0

通行证通过引用应被使用 - *符号(指针地址),&是“值在地址CGImageRefCGImage.h类定义为CGImage *CGImageRef;所以编译器ERR ..

0

不,您不能使用引用传递机制,也不能在C中使用默认值。如果Obj-C是C的后代,这意味着合法的C代码可以被Obj-C编译接受,而不是反向的。

但是你犯了一个错误,在Objective-C中没有引用和默认值。这两种结构都是C++的,而不是C的。 Objective-C和C++混合使用,它被称为Objective-C++。

C++和Objective-C都是C的后代,所以混合使用。