Làm thế nào để sử dụng đối số Macro dưới dạng chuỗi ký tự?


90

Tôi đang cố gắng tìm ra cách viết một macro sẽ chuyển cả biểu diễn chuỗi ký tự của tên biến cùng với chính biến đó vào một hàm.

Ví dụ cho 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);

Cái nào sẽ in ra: my_val: 5

Tôi đã thử 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ế, mà chỉ được chuyển dưới dạng chuỗi theo nghĩa đen "VAR". Vì vậy, tôi muốn biết liệu có cách nào để biến đối số macro thành một chuỗi ký tự không.


Bạn đang cố gắng sử dụng cái này như thế nào?
chris

Câu trả lời:



28

Bạn muốn sử dụng toán tử xâu chuỗi:

#define STRING(s) #s

int main()
{
    const char * cstr = STRING(abc); //cstr == "abc"
}

9

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";

Làm thế nào để trả lời câu hỏi này hoặc nó hữu ích như thế nào?
jirigracik

1
@jirigracik - Nó cho phép để có được chuỗi trình bày của việc mở rộng vĩ mô là tốt, không giống như câu trả lời khác
grepcake

3
Tôi nghĩ sẽ hữu ích nếu giải thích tại sao chỉ có thôi QUDI(x)là không đủ.
LRDPRDX

8
#define NAME(x) printf("Hello " #x);
main(){
    NAME(Ian)
}
//will print: Hello Ian

Tôi không hoàn toàn chắc chắn, nhưng có vẻ như "Hello" #x"(và #x "Hello") khiến chuỗi được dán lại với nhau mà không có khoảng trống, đó là điều mong muốn trong một số trường hợp, vì vậy đây là câu trả lời khá tốt.
Smar

1
@Smar Hãy chắc chắn rằng bạn đặt một không gian sau chuỗi liên tục Xin chào: "Hello " #x
jack

Được rồi, tôi nghĩ vậy, bạn nên chỉnh sửa mà câu trả lời của bạn quá vì nó mảnh có giá trị của thông tin :)
Smar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.