2011-07-12 51 views
18

Có thể vượt qua kiểu dữ liệu như là một phần của một tham số chức năng, ví dụ .:Đi qua kiểu biến như tham số chức năng

void foo(varType type) 
{ 
    // Cast to global static 
    unsigned char bar; 
    bar = ((type *)(&static_array))->member; 
} 

Tôi nhớ nó có cái gì để làm với GCC của typeof và sử dụng các macro?

+5

Không có trong tiêu chuẩn C. Có lẽ trong GCC, nếu bạn là (un) may mắn. –

Trả lời

12

Bạn không thể làm điều đó cho một hàm, bởi vì sau đó nó cần phải biết các loại các đối số (và bất kỳ ký hiệu nào khác mà hàm sử dụng) để tạo mã máy làm việc. Bạn có thể thử một macro như:

#define foo(type_t) ({ \ 
    unsigned char bar; \ 
    bar = ((type_t*)(&static_array))->member; \ 
    ... \ 
    }) 
2

Tôi không thấy cách bạn có thể thực hiện việc này trong trường hợp chung, với điều kiện C là statically typed language.

Trình biên dịch cần biết tại thời điểm biên dịch loại type * là để có thể tạo tham chiếu đến ->member.

+0

Đừng quá tiêu cực có thái độ có thể làm nhiều hơn;) –

25

Bạn có thể làm một enum cho tất cả các loại khác nhau có thể, và sử dụng một công tắc để làm cho dereferencing:

typedef enum { 
    CHAR, 
    INT, 
    FLOAT, 
    DOUBLE 
} TYPE; 

void foo(TYPE t, void* x){ 
    switch(t){ 
     case CHAR: 
      (char*)x; 
      break; 
     case INT: 
      (int*)x; 
      break; 
     ... 
    } 
} 
+0

Xin chào, tôi xin lỗi nhưng tôi không hiểu giải pháp thay thế. Bạn có thể xây dựng một chút không? Cảm ơn :-) – leaf

+0

Tôi chỉ nhận ra rằng các thay thế không thực sự làm việc như văn bản ... vì vậy tôi đã xóa nó. Nhưng ý tưởng cơ bản ban đầu tôi có là viết mã những thứ theo kiểu "hướng đối tượng" và sử dụng đa hình phụ để thực hiện phân nhánh thay vì câu lệnh chuyển đổi. – hugomg

+0

Được rồi. Cảm ơn :-) – leaf

3

Không phải là một chức năng, nhưng bạn có thể sử dụng một macro như sau:

#include <stdio.h> 
#define swap(type, foo, bar) ({type tmp; tmp=foo; foo=bar; bar=tmp;}) 

int main() { 
    int a=3, b=0; 
    printf("a=%d, b=%d \n", a, b); // a=3, b=0 
    swap(int, a, b); // <-- action happens here 
    printf("a=%d, b=%d \n", a, b); // a=0, b=3 

    return 0; 
} 
Các vấn đề liên quan