指针类型不同时如何生成编译错误?
当两个指针a和b具有不同的基类型时,如何编写生成编译错误的宏CHECK(a,b)。
CHECK((int*)0, (char*)0) -> compilation error CHECK((int*)0, (int*)0) -> works
我正在寻找一些C89代码,但C99 + gcc扩展也可以。
编辑现在适用于任何类型,而不仅仅是指针
使用GCC扩展typeof()
或多或少从linux内核中提取的东西。
这会在编译时生成警告,它也适用于整数指针类型
#define CHECK(a, b) do { \ typeof(a) _a; \ typeof(b) _b; \ (void) (&_a == &_b); \ } while (0) int main(int argc, char **argv) { int *foo; int *bar; char *baz; CHECK(foo, bar); CHECK(bar, baz); return 0; }
我不知道如何使用宏来做到这一点。 如果你可以使用C ++,那么看看这里
你可以这样试试:
#define CHECK(A,B) do { typeof(*A) _A; typeof(*B) _B; _A = _B; } while (0)
如果您的基类型而不是整数类型(char,int,short,long,long long),则不会提升类型,因此赋值_A = _B
将失败。
我认为没有办法让它适用于整数类型。