2010-03-12 32 views
28

Bản sao có thể xảy ra:
Optional arguments in Objective-C 2.0?
Objective-C Default Argument ValueMục tiêu C Các tham số mặc định?

Tôi đang viết một hàm C trong C. Mục tiêu tôi muốn có một giá trị mặc định cho tham số cuối cùng của tôi.

Tôi đã thử:

foo(int a, int b, int c = 0); 

nhưng đó là C++

Tôi cũng đã thử

foo(int a, int b, int c) 
{ 
... 
} 

foo(int a, int b) 
{ 
    foo(a, b, 0); 
} 

Nhưng đó là CŨNG C++.

có cách nào để thực hiện điều này trong Mục tiêu C không?

+1

Bản sao của http://stackoverflow.com/questions/871796/objective-c-default-argument-value và/hoặc http://stackoverflow.com/questions/561185/optional-arguments-in-objective-c -2-0, tôi tin. –

+0

Cách đầu tiên kém hữu ích hơn vì mọi người đều trả lời cho cuộc gọi phương thức hoặc một câu lệnh không chính xác mà bạn có thể có hai hàm foo. Thứ hai là tất cả các cuộc gọi phương thức ... –

Trả lời

89

Không có tham số mặc định trong ObjC.

Bạn có thể tạo 2 phương pháp mặc dù:

-(void)fooWithA:(int)a b:(int)b c:(int)c { 
    ... 
} 
-(void)fooWithA:(int)a b:(int)b { 
    [self fooWithA:a b:b c:0]; 
} 

Đối với C: không có gì đặc biệt được bổ sung vào nhóm C bằng cách sử dụng ObjC là. Bất cứ điều gì mà không thể được thực hiện trong tinh khiết C không thể được thực hiện bằng cách biên dịch trong ObjC hoặc. Điều đó có nghĩa là, bạn không thể có các tham số mặc định, cũng như không làm quá tải một hàm. Thay vào đó, hãy tạo 2 hàm.

+5

+1 đó là đúng cách. :) Tương tự nếu bạn thực sự cần một hàm C: sử dụng các tên khác nhau. – Macmade

+0

@macmade yeah 'đó là những gì tôi hiện đang làm ... Tôi chỉ nghĩ rằng phong cách mặc định C++ làm cho mã sạch hơn một chút ... –

+0

@Kenny, vâng nhưng điều này không thực sự thuộc về bất kỳ lớp nào. nó thực sự là một chức năng độc lập C ... –

1

Đối với hàm C - không. Đối với một phương thức lớp C mục tiêu - có, bạn chỉ cần làm hai phương pháp, một trong số chúng một tham số ngắn, gọi phương thức khác.

Hoặc bạn có thể đổi tên nguồn của mình thành các hàm .mm và C một cách kỳ diệu trở thành C++.

+0

Đó là một khả năng thú vị ... Tôi ' sẽ phải tính toán chi phí của điều đó trong các phần khác của tích hợp của tôi ... –

+0

Lưu ý rằng điều này thay đổi trang trí tên toàn cầu. Bạn sẽ không thể gọi hàm như vậy từ bên ngoài từ nguồn .m/.c; nếu có một cách để khai báo một hàm như là "extern C++", vì vậy, để nói, tôi không quen thuộc với nó. Nói cách khác, nếu bạn đang sử dụng ObjC++, bạn nên làm điều này trong suốt dự án. –

1

Bạn có thể viết một hàm C với một danh sách đối số chiều dài thay đổi. Bạn có thể sử dụng '...' làm kiểu dữ liệu cho một trong các tham số khai báo hàm của bạn để xác định vị trí trong danh sách tham số mà danh sách đối số biến bắt đầu. (Điều đó cho phép bạn có một hoặc nhiều đối số bắt buộc trước khi bắt đầu danh sách.)

printf() là một ví dụ về hàm được viết bằng cơ sở này (được gọi là varargs).

printf(const char *restrict format, ...); 

Ở đây, đối số đầu tiên là bắt buộc, sau đó có thể theo sau bằng 0 hoặc nhiều đối số bổ sung.

Nếu bạn đã viết hàm theo cách này, nó có thể cung cấp giá trị mặc định cho tham số bị thiếu.

Các vấn đề liên quan