2015-05-25 151 views
17

有沒有一種辦法GCC的typeof擴展轉換爲字符串,例如:typeof運算字符串轉換

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

所以,我可以做的:

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

,並得到輸出:

Type of a is: int 

該可能的用途如下:

#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; 
} 

如果可能的話,它應該工作的所有類型,包括結構和聯合,而不依賴於手動添加每一個類型的列表。

+1

你可以嘗試使用一種類型的泛型宏? –

+1

你爲什麼想這樣做? –

回答

17

由於C11,你可以使用一個通用的,看到http://en.cppreference.com/w/c/language/generic。例如:

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

每種可以使用的類型都需要列出。

在C++中,也有個typeid關鍵字:

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

這正是我所期待的! – user2868331

+0

'_Generic'對類型選擇器有一些含糊之處。特別是在依賴合格類型之前,請參閱我的答案中的鏈接。 – Olaf

5

處理器編譯器之前運行。所以它的所有替換都是在實際編譯開始之前執行的。編譯器對typeof()進行了評估,該編譯器只會看到一個字符串"typeof()",這顯然不會被評估。

因此,答案是:不預C11。對於C11,看到@tmlen答案,但要注意也有對_Generic類型選擇它們在不同的編譯器不同的解決了一些歧義,可以至極導致與合格類型的問題。有一個關於這個問題的一個缺陷報告,讀延Gustedt的BLOB的細節:https://gustedt.wordpress.com/2015/05/11/the-controlling-expression-of-_generic/#more-2256(他還提交了一份缺陷報告http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_423.htm)。