2011-10-14 37 views
6

Tôi đang cố gắng in ra bảng điều khiển bằng cách sử dụng macro tên biến cho giá trị thành viên hiển thị trong khi gỡ lỗi (ghi nhật ký). Làm thế nào để làm điều đó? Tôi đã thử những điều sau đây nhưng nó không hoạt động.tên biến in trong #define

#define MY_PRINT(x) std::cout << "'x'=" << x << std::endl; 

int main(){ 
    int my_variable=3; 
    MY_PRINT(my_variable); 
    // I would like to print to console 
    // 'my_variable'=3 
} 
+2

Xác định "nó không hoạt động". Tôi đã phải nói điều đó với bạn rất nhiều lần trong quá khứ, là tốt, đó là một sự xấu hổ. –

+0

Xin chào Tomalek, vui lòng xem câu trả lời bên dưới. Đủ để thêm ký tự '#' –

+2

Vâng, tôi cũng biết chính câu trả lời là gì. Nhưng tôi đang cố gắng đào tạo bạn, trễ một chút, viết những câu hỏi thích hợp. –

Trả lời

17

Auch ... Tôi đã tìm ra giải pháp.

tôi nên viết vĩ mô như thế này

#define MY_PRINT(x) std::cout << #x"=" << x << std::endl 
2

Đối với C++ Tôi sử dụng này:

#define STR(x) #x << '=' << x 

int main() 
{ 
    int i = 1; 
    std::string str("hello"); 
    std::vector<std::string> vec; 
    my_class mc; 

    ... 

    std::cout << STR(i) << std::endl 
      << STR(str) << std::endl 
      << STR(vec) << std::endl 
      << STR(mc) << std::endl; 

    return 0; 
} 

Bằng cách này, biên dịch sẽ chọn các nhà điều hành trực tuyến dựa trên các kiểu dữ liệu, vì vậy bạn không cần phải bận tâm với các macro khác nhau cho mỗi, và nó có thể đi đến bất kỳ std :: ostream, không chỉ std :: cout. Chỉ cần cung cấp các nhà điều hành trực tuyến thích hợp cho dữ liệu của bạn:

std::ostream operator<<(std::ostream&, const T&); 
std::ostream operator<<(std::ostream&, const std::vector<T>&); 
etc 

Nhưng tôi muốn có một mẫu cách để thay thế vĩ mô, hoặc ít nhất là tên biến được cung cấp bởi cáC#x.