c语言双指针,const双指针的惯用C语言

Jens Gustedt..

7

虽然你已经接受了答案,但我想找到3)即宏.你可以用这样的方式编写这些函数,函数的用户只需编写一个调用foo(x);,其中x可以被const限定.这个想法将有一个宏CASTIT执行转换并检查参数是否是有效类型,另一个是用户界面:

void totoFunc(char const*const* x);

#define CASTIT(T, X) ( \

(void)sizeof((T const*){ (X)[0] }), \

(T const*const*)(X) \

)

#define toto(X) totoFunc(CASTIT(char, X))

int main(void) {

char * * a0 = 0;

char const* * b0 = 0;

char *const* c0 = 0;

char const*const* d0 = 0;

int * * a1 = 0;

int const* * b1 = 0;

int *const* c1 = 0;

int const*const* d1 = 0;

toto(a0);

toto(b0);

toto(c0);

toto(d0);

toto(a1); // warning: initialization from incompatible pointer type

toto(b1); // warning: initialization from incompatible pointer type

toto(c1); // warning: initialization from incompatible pointer type

toto(d1); // warning: initialization from incompatible pointer type

}

该CASTIT宏看起来有点复杂,但它所做的是首先检查是否X[0]是分配兼容char const*.它使用复合文字.然后将其隐藏在a中sizeof以确保实际上永远不会创建复合文字,X并且该测试也不会评估复合文字.

然后是一个普通的演员,但这本身就太危险了.

正如您在main本文中的示例中所看到的那样,可以准确地检测出错误的情况.

宏可以实现很多这样的东西.我最近想出一个复杂的例子有const-qualified阵列.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值