c語言有辦法判斷(比較)變數型別嗎?

時間 2021-05-30 10:58:48

1樓:囧天大聖

你可以試一試函式過載來模擬一下,雖然沒那麼完美int Type(int _var)

int Type(unsigned int _var)int Type(float _var)

//之後這麼識別,反正最後編譯器會優化掉的int int_var=15555;

float fvar =45.9L;

if(Type(int_var)==Type(fvar)

2樓:

我說一下。我的做法。

我是在乙個幾年前做乙個小工具的時候用的這個方法。我用的就是C語言,開發工具VS。

我設計了乙個元資料層的DLL,裡邊封了一些函式,當然這些函式也是呼叫其它DLL中的函式。那也都是我寫的,不是系統現成的。這其中乙個功能就是型別判斷。

當時我做的功能比較簡單,如果複雜一點就是容器。但我做得只是有點影子而已,因為這個不是我的目的,我是要做我那個工具。我說這些就是告訴你可以實現,只是比較複雜。

不是利用C語言的本身編譯判斷,而是自己設計乙個模組來實現。詳細的情況我記不清了。反正因為一些原因那個小工具的主體功能沒實現,只是這部分作為基礎模組做出來調通了而已。

現在要是再做我不會設計得那麼差了。

3樓:

不能,也不認為這樣做有什麼意義。

任何型別在記憶體中都是0101001010110010100101001010101010

你覺得能怎麼判斷?除非你再用另乙個變數儲存這個變數的型別但這樣有什麼意義?況且這樣也不能定義為「判斷」了

4樓:

也就是typeof/sizeof能用用,不過c只要關注位址和大小就行了。複雜物件就手動擼個虛表,封裝一些基本元語就差不多了。

5樓:Aloxaf

見gcc的一堆__builtin_ : Using the GNU Compiler Collection (GCC): Other Builtins

以及c11的_Generic C11 (C standard revision)

不過基本上都只能用在巨集裡面...

用__builtin__舉個沒有實際意義的例子

#include

#include

void

swap_double

(double*x

,double*y

);void

swap_int

(int*x

,int*y

);#define typecmp(X, Y) __builtin_types_compatible_p(typeof(X), Y)

#define swap(x, y

typeof(x) p_x = (x), p_y = (y

if (typecmp(x, double*) && typecmp(y, double*)) \

swap_double(p_x, p_y

else if (typecmp(x, int*) && typecmp(y, int*)) \

swap_int(p_x, p_y

else

abort

}void

swap_double

(double*x

,double*y

)void

swap_int

(int*x

,int*y

)int

main

(void

)= = 相當痛苦, 而且一堆warning不知道如何消掉......(這個大概是我姿勢水平的問題)

_Generic也沒好到哪去, 給人感覺就是殘廢玩意兒. 只支援單引數, 多引數得各種trick更痛苦.

Generics for multiparameter C functions in C11

其實對於C來說, 大部分需要用到變數型別的地方用sizeof就行了

當然搭配__builtin__可以更嚴格

#define swap(X, Y

typeof(X) _X = (X

typeof(Y) _Y = (Y

static_assert(__builtin_types_compatible_p(typeof(_X), typeof(_Y)), \

34;WTF???"

_swap(_X, _Y, sizeof(*_X

}void

_swap

(void*a

,void*b

,size_ts)

程式語言為什麼有變數型別這個概念?

劉志軍 並不是所有語言的變數都有型別啊 python中的 變數 嚴格來說是name 是沒有型別這一說的。例如 a 1 b hello c 1,2 3 a,b,c 3個變數都是沒有型別的,真正有型別的是後面那個值,1 是整數型別,hello 是字串型別,1,2,3 是列表型別。其實python中的 變...

c語言陣列可以儲存不同型別資料嗎?

乙隻樹 不可以,陣列的元素必須時同一種型別,因為記憶體的分配是按照 單個元素所佔記憶體 元素個數分配的。當然,你的陣列元素可以是不同型別成員組成的乙個結構體型別。 在c 裡可以做到,比如std variantauto printer auto value else ifconstexpr std i...

C語言對乙個變數取位址是真實的位址嗎?

碼農的荒島求生 這要看情況,看什麼情況?1,是否裝有作業系統 2,作業系統是否支援虛擬記憶體如果沒有啥作業系統或裝有作業系統但不支援虛擬記憶體,那麼你在C語言中對變數取位址得到的就是真實的物理記憶體位址。如果作業系統支援虛擬記憶體,那麼你獲取到的就不再是真實的物理記憶體位址,而是邏輯位址。 劉世超 ...