2016-05-20 12 views
5

Có thể xác định macro sẽ cắt bỏ một phần của đối số chuỗi được truyền vào không?Macro có thể xóa các ký tự khỏi các đối số của nó không?

Ví dụ:

//can this be defined? 
#define MACRO(o) ??? 

int main(){ 
    printf(MACRO(ObjectT)); //prints "Object" not "ObjectT" 
} 

Nó sẽ có thể cho một macro mà cắt ra khỏi ký tự cuối cùng 'T'?

+0

viết 'do ... while', tính' strlen' và in tối đa 'strlen-2' ... nhưng nó quá rộng ... –

+1

' #define ObjectT "Object" ',' #define MACRO (o) o' .... –

+3

Không có cách nào để làm những gì bạn muốn. Bạn có thể thêm ký tự vào số nhận dạng nhưng bạn không thể xóa chúng. –

Trả lời

4

Bạn có thể làm điều đó cho các chuỗi cụ thể mà bạn biết trước, được trình bày với macro dưới dạng ký hiệu thay vì chuỗi ký tự, chứ không phải cho ký hiệu chung và không cho chuỗi ký tự. Ví dụ:

#include <stdio.h> 

#define STRINGIFY(s) # s 
#define EXPAND_TO_STRING(x) STRINGIFY(x) 
#define TRUNCATE_ObjectT Object 
#define TRUNCATE_MrT Pity da fool 
#define TRUNCATE(s) EXPAND_TO_STRING(TRUNCATE_ ## s) 

int main(){ 
    printf(TRUNCATE(ObjectT)); // prints "Object" 
    printf(TRUNCATE(MrT));  // prints "Pity da fool" 
} 

Đó dựa vào các nhà điều hành mã thông báo dán, ##, để xây dựng tên của macro mở rộng đến các văn bản cắt ngắn (hoặc, thực sự, văn bản thay thế), và các nhà điều hành stringification, # , để chuyển đổi kết quả mở rộng thành chuỗi ký tự. Có một chút nhu cầu macro cần thiết trong đó, quá, để đảm bảo rằng tất cả các mở rộng cần thiết được thực hiện.

-2

Với bộ tiền xử lý? Số Nghe có vẻ giống như những gì bạn thực sự muốn làm là một cái gì đó như thế này:

Mã không được kiểm tra

#define STRINGIFY(o) #o 

char* serialize(char* s) 
{ 
    if (strcmp(s, "ObjectT") == 0) return "Object"; 
} 

int main(){ 
    printf(serialize(STRINGIFY(#o))); //prints "Object" not "ObjectT" 
} 
+0

Downvoter giải thích? – user6362627

+0

Nếu bạn đang làm theo cách này, những gì ngăn cản từ 'serialize' của bạn chỉ để cắt các ký tự? –

+0

@EugeneSh. Chắc chắn làm điều đó nếu bạn muốn, nhưng tôi đang thực hiện một dự đoán giáo dục cho vấn đề thực tế của OP. Điều đó thực sự đảm bảo một downvote? – user6362627

-1

Vâng, ít nhất nó nên in "Object" ...

//can this be defined? 
#define MACRO(o) #o "\b \b" 

int main(){ 
    printf(MACRO(ObjectT)); //prints "Object" not "ObjectT" 
} 

Và không, bạn không thể tách ký tự bằng cách sử dụng bộ xử lý trước mà không có mã C thực tế (ví dụ: malloc + strncpy) để làm điều đó.

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