2012-05-08 34 views
55

Tôi đang cố gắng tìm ra cách viết một macro sẽ truyền cả hai biểu diễn dạng chuỗi của một tên biến cùng với biến đó vào một hàm.Làm thế nào để sử dụng đối số Macro dưới dạng chuỗi ký tự?

Ví dụ: được cung cấp chức năng sau.

void do_something(string name, int val) 
{ 
    cout << name << ": " << val << endl; 
} 

tôi muốn viết một macro để tôi có thể làm điều này:

int my_val = 5; 
CALL_DO_SOMETHING(my_val); 

Trong đó sẽ in ra: my_val: 5

tôi đã cố gắng làm như sau:

#define CALL_DO_SOMETHING(VAR) do_something("VAR", VAR); 

Tuy nhiên, như bạn có thể đoán, VAR bên trong dấu ngoặc kép không được thay thế, nhưng chỉ được chuyển thành chuỗi chữ "VAR". Vì vậy, tôi muốn biết nếu có một cách để có đối số macro được biến thành một chuỗi chữ chính nó.

+0

Bạn đang cố gắng để sử dụng cái này? – chris

Trả lời

92

Sử dụng tiền xử lý # operator:

#define CALL_DO_SOMETHING(VAR) do_something(#VAR, VAR); 
22

Bạn muốn sử dụng các nhà điều hành stringizing:

#define STRING(s) #s 

int main() 
{ 
    const char * cstr = STRING(abc); //cstr == "abc" 
} 
5
#define NAME(x) printf("Hello " #x); 
main(){ 
    NAME(Ian) 
} 
//will print: Hello Ian 
+0

Tôi không hoàn toàn chắc chắn, nhưng có vẻ như '" Hello "#x" '(và' #x "Hello" ') làm cho chuỗi được dán lại với nhau mà không có không gian, đó là những gì mong muốn trong một số trường hợp, vì vậy – Smar

+0

@Smar Hãy chắc chắn rằng bạn đặt một dấu cách sau chuỗi liên tục Xin chào: '" Xin chào "# x' – jack

+0

Được rồi, tôi nghĩ vậy, bạn cũng nên chỉnh sửa câu trả lời đó vì đó là phần thông tin có giá trị :) – Smar

0

Có lẽ bạn thử giải pháp này:

#define QUANTIDISCHI 6 
#define QUDI(x) #x 
#define QUdi(x) QUDI(x) 
. . . 
. . . 
unsigned char TheNumber[] = "QUANTIDISCHI = " QUdi(QUANTIDISCHI) "\n"; 
Các vấn đề liên quan