c语言有办法判断(比较)变量类型吗

见gcc的一堆__builtin_ : Using the GNU Compiler Collection (GCC): Other Builtins
以及c11的_Generic C11 (C standard revision)
不过基本上都只能用在宏里面...

用__builtin__举个没有实际意义的例子
#include \u0026lt;stdio.h\u0026gt;#include \u0026lt;stdlib.h\u0026gt;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*) \u0026amp;\u0026amp; typecmp(y, double*)) \\ swap_double(p_x, p_y); \\ else if (typecmp(x, int*) \u0026amp;\u0026amp; typecmp(y, int*)) \\ swap_int(p_x, p_y); \\ else \\ abort(); \\ }void swap_double(double* x, double* y){ double tmp = *x; *x = *y; *y = tmp;}void swap_int(int* x, int* y){ int tmp = *x; *x = *y; *y = tmp;}int main(void){ int x = 5, y = 6; double a = 5, b = 6; swap(\u0026amp;x, \u0026amp;y); swap(\u0026amp;a, \u0026amp;b); printf("%d-%d\", x, y); printf("%f-%f\", a, b);}= = 相当痛苦, 而且一堆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)), \\ "WTF???"); \\ _swap(_X, _Y, sizeof(*_X)); \\ }void _swap(void* a, void* b, size_t s){ void* tmp = malloc(s); memcpy(tmp, a, s); memcpy(a, b, s); memcpy(b, tmp, s); free(tmp);}
■网友
不能,影响就是换C++模板
■网友
你要是用 GObject,或者自己撸一套 runtime,那么就可以有反射功能了(逃

■网友
C语言...
语言没有提供这个功能.
靠自己发挥比如这样:
你想也许可以放个识别类的东西在里面,那么先从基础类开始:
typedef struct {uint32_t typeid_;int v;}Int;但是这么干首先有个问题,id怎么分配?于是你用个enum来帮助解决问题:
typedef enum{INT_,DOUBLE_,CHAR_,...}TypeId;//那么Int要写成:typedef struct {uint32_t typeid_ = INT_;int v;}Int;接下来你每增加一个结构都要写成这样的形式,为防止自己写错,以及方便,你用宏对这些东西规范一下:


推荐阅读