2015-05-25 15 views
17

Có cách nào để chuyển đổi phần mở rộng typeof gcc của một chuỗi, ví dụ:Chuyển đổi typeof chuỗi

#define printType(a) printf("%s", #typeof(a)) 

Vì vậy mà tôi có thể làm:

int a = 4; 
printf("Type of a is: "); 
printType(a); 

Và nhận được đầu ra của:

Type of a is: int 

Có thể sử dụng điều này như sau:

#include <stdio.h> 

#define indirect_print(a) print_##typeof(a)(a) 

void print_int(int *i) { 
    printf("%d", *i); 
} 

void print_char(char *c) { 
    printf("%c", *c); 
} 

int main(void) { 
    char C = 'C'; 
    int I = 100; 

    { 
     char *a = &C; 
     indirect_print(a); 
    } 

    { 
     int *a = &I; 
     indirect_print(a); 
    } 

    return 0; 
} 

Nếu có thể, nó sẽ hoạt động cho tất cả các loại bao gồm cấu trúc và công đoàn, mà không phải dựa vào việc thêm mọi loại vào danh sách theo cách thủ công.

+1

Bạn có thể thử sử dụng một kiểu generic vĩ mô? –

+1

Tại sao bạn muốn làm điều này? –

Trả lời

17

Vì C11, bạn có thể sử dụng chung, xem http://en.cppreference.com/w/c/language/generic. Ví dụ:

#define printType(a) printf("%s", _Generic((a) , \ 
            int : "int", \ 
            long : "long", \ 
            float : "float", \ 
            default : "other type"))(a) 

Mỗi loại có thể được sử dụng cần phải được liệt kê.

Trong C++, đó cũng là typeid keyword:

#include <typeinfo> 
#define printType(a) std::cout << typeid(a).name() << std::endl; 
+0

Đây chính xác là những gì tôi đang tìm kiếm! – user2868331

+0

'_Generic' có một số sự mơ hồ về các bộ chọn loại. Xem các liên kết trong câu trả lời của tôi trước khi dựa vào các loại đủ điều kiện đặc biệt. – Olaf

5

Bộ xử lý trước chạy trước trình biên dịch. Vì vậy, tất cả các thay thế của nó được thực hiện trước khi biên dịch thực tế được bắt đầu. typeof() được đánh giá bởi trình biên dịch, sẽ chỉ thấy một chuỗi "typeof()" mà rõ ràng sẽ không được đánh giá.

Vì vậy, câu trả lời là: không phải cho tiền C11. Đối với C11, xem câu trả lời của @tmlen, nhưng lưu ý rằng có một số sự mơ hồ về bộ chọn loại _Generic được giải quyết khác nhau trong các trình biên dịch khác nhau, có thể gây ra sự cố với các loại đủ điều kiện. Có một báo cáo lỗi về vấn đề này, hãy đọc blob của Jens Gustedt để biết chi tiết: https://gustedt.wordpress.com/2015/05/11/the-controlling-expression-of-_generic/#more-2256 (ông cũng đệ trình một báo cáo lỗi http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_423.htm).