为什么我不能向接受const char ** 的函数传入char **?

本文探讨了在C和C++混合编程环境下,从C风格的char**向C++风格的const char**进行参数传递时遇到的问题及解决办法。通过分析编译器对两种类型的不同处理方式,揭示了错误产生的原因,并提供了有效的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编译sv/feature/cluster 下面这行
rc = nsr_cluster_insert2db(key_image); 出错:
test.c|47| error: invalid conversion from ‘char**’ to ‘const char**’

但是在我 的测试程序中,仅仅给出了警告:
  1. #include<stdio.h>
  2. intmain(){
  3. char**_p;
  4. fun(_p);
  5. }
  6. voidfun(constchar**p){
  7. printf("test/n");
  8. }
  9. ~
  10. ~


查了C FAQ,下面这段话暂没看懂:

11.10 为什么我不能向接受const char ** 的函数传入char **?
你可以向接受const-T 的指针的地方传入T 的指针(任何类型T 都适用)。但
是, 这个允许在带修饰的指针类型上轻微不匹配的规则(明显的例外) 却不能递归
应用, 而只能用于最上层。
如果你必须赋值或传递除了在最上层还有修饰符不匹配的指针, 你必须明确
使用类型转换(本例中, 使用(const char **)), 不过, 通常需要使用这样的转换意
味着还有转换所不能修复的深层次问题。
参考资料: [ISO, Sec. 6.1.2.6, Sec. 6.3.16.1, Sec. 6.5.3]; [H&S, Sec. 7.9.1 pp.
221-2]

找到出问题的原因了。 上面的test.c虽然是用gcc编译的,但是其中调用 的nsr_cluster_insert2db(key_image)函数是由g++编译链接的共享库libnsrcluster.so提供,所以nsr_cluster_insert2db 函数以C++的方式处理入参,而C++的类型转换规则更加严格,所以编译test.c时就会出现invalid conversion的错误。

以下是makefile的部分内容:
libnsrcluster.so:$(SRC)
g++ -shared -o $@ $^ $(LIBPATH) $(LIB) $(INCLUDE)
test:test.c libnsrcluster.so
gcc -g -o $@ $< $(INCLUDE) $(LIBPATH) $(LIB) -llpool -lnsrcluster



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值