2012-06-06 30 views
6

Tôi đang cố tạo một định nghĩa macro có thể phát ra C++ hoặc Objective-C tùy thuộc vào ngữ cảnh nhưng dường như không thể xây dựng một NSString bên trong macro một cách dễ dàng. C++ phiên bản là đơn giản vì nó sử dụng dây thông thường, nhưng đã có một phát ra NSString là minh khéo léo:Định nghĩa tiền xử lý Objective-C, Dynamic C-String để NSString Declaration

#define FOO(x) bar(@##x) 

Kết quả dự định là để chuyển đổi một đối số chuỗi để một cuộc tranh cãi NSString bằng cách đặt trước với @:

FOO("x") 
// => bar(@"x") 

gì tôi nhận được thay vào đó là một lỗi có thể ngăn chặn biên soạn:

Pasting formed '@"x"', an invalid preprocessing token 

Trả lời

5
NSString *x = @"text"; 

Equals:

NSString *x = CFSTR("text"); 

PS NSString * và CFStringRef và __CFString * và cũng NSCFStringRef đều như nhau: Toll-Free Bridged Types

+0

'CFSTR' có triển vọng nhưng đó là' CFStringRef' chứ không phải 'NSString *'. – tadman

+1

@tadman chúng là một và giống nhau, và được thu phí cầu nối. –

+1

@tadman: CFStringRef = NSString. – Dani

3

Bạn không thể sử dụng ## để ghép các yếu tố, trừ khi họ tạo thành một tiền xử lý hợp lệ thẻ với nhau, nhưng bạn có thể gọi constructor NSString 's mà phải mất một chuỗi C, như thế này:

#define FOO(x) [NSString stringWithUTF8String:(x)] 
+0

Đó có phải là thứ được phân bổ sau, không giống '@" ... "' là tĩnh, phải không? – tadman

+0

@tadman Điều này tạo ra một chuỗi tự động phát hành, bạn không sở hữu nó trừ khi bạn giữ lại nó. – dasblinkenlight

+0

Ah, rất vui được biết. – tadman

3

Um, tại sao không này:

0.123.
#define FOO(x) bar(@x) 

?

Không cần phải dán mã thông báo hoặc xâu chuỗi hoặc bất kỳ điều gì lạ. Bạn chỉ muốn những gì trong danh sách đối số tại điểm thay thế được đặt trước bởi dấu @. Vì vậy, chỉ cần làm điều đó.

+0

chỉ hoạt động nếu x là dấu ngoặc kép. Đôi khi điều đó là không mong muốn. Ví dụ: '#define CASE_TO_NAME (x) case x: return (NSString *) CFSTR (x); break' sau đó một câu lệnh switch 'switch (val) {CASE_TO_NAME (foo); CASE_TO_NAME (thanh); // etc.} ' – Olie

+0

Chắc chắn, nhưng đó không phải là câu hỏi. Và ví dụ của bạn sẽ phá vỡ vì nó không xâu chuỗi 'x' trong' CFSTR (x) '. –

+0

Ví dụ của tôi là cố định khi bạn thay đổi thành 'CFSTR (#x)', điều này phải rõ ràng. (Tại sao tôi không thể chỉnh sửa bình luận của mình ?!) – Olie

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