2012-01-13 15 views
6

Tôi đã xác định một macro MYMACRO. Lưu ý: giá trị không phải là một NSString hợp lệ.Làm thế nào để mở rộng một MACRO vào NSString mà không sử dụng bất kỳ nối chuỗi nào khi chạy?

#define MYMACRO is 

Các vĩ mô được sử dụng bên việc kê khai của một NSString

@"This MYMACRO fun" 

Tuy nhiên, tiền xử lý không mở rộng vĩ mô. Kết quả xử lý trước là

@"This MYMACRO fun" 

Giải pháp tốt nhất mà tôi tìm thấy cho đến nay để có được những vĩ mô mở rộng là:

#define MYMACRO @"is" 
@"This "[email protected]" fun" 

Macro mở rộng như sau đó là một cú pháp Objective-C hợp lệ:

@"This "@"is"@" fun" 

Tuy nhiên, điều này yêu cầu 2 nối vào thời gian chạy.

Vì vậy, câu hỏi của tôi là làm thế nào để chèn một macro insto một NSString mà không sử dụng bất kỳ nối chuỗi tại thời gian chạy?

Lý tưởng nhất, tôi muốn thời gian chạy thực @"This is fun" hơn @"This "@"is"@" fun"

Trả lời

6

Tôi khá chắc chắn những gì bạn có đã được concatenating tại thời gian biên dịch, và không chạy.

+1

Bạn là chính xác. Nếu bạn tạo assembly cho đoạn mã nối như thế này, bạn có thể thấy rằng nó kết thúc bằng một chuỗi .asciiz. – UIAdam

+0

Tôi nghĩ rằng nó cũng có giá trị thêm rằng ngay cả khi nối đã xảy ra trong thời gian chạy, nó không có giá trị uốn qua phía sau để viết một số macro xấu xí chỉ để tiết kiệm một vài hoạt động chuỗi. Viết mã rõ ràng trước và sau đó lo lắng về hiệu suất. Cá nhân tôi sẽ xem xét việc sử dụng stringWithFormat để chèn một NSString bên trong một cái khác. – UIAdam

+0

@AdamW: Bạn có nghĩa là trình biên dịch tối ưu hóa @ "This" @ "là" @ "fun" vào "" Đây là niềm vui "tại thời gian biên dịch không? Tôi đồng ý với bạn, tôi muốn có mã nguồn đơn giản thay vì lưu một số thao tác chuỗi. Tôi rơi vào tối ưu hóa sớm và tất cả chúng ta đều biết ý nghĩa của nó: "Tối ưu hóa sớm là gốc rễ của mọi điều ác - D. Knuth" –

-2
#define MYMACRO @"is" 
[NSString stringWithFormat:@"This %@ fun",MYMACRO] 
Các vấn đề liên quan