如何定义C++变量存储C字符串字面量适配C-API函数?
解决C++中C宏字符串字面量赋值给变量的问题
这是C++类型安全机制带来的典型小坑,我来帮你理清正确的解决方式:
直接解决方案
把你的变量声明从:
char * binnMode;
改成:
const char* binnMode;
之后再执行赋值:
binnMode = XI_PRM_BINNING_HORIZONTAL_MODE;
这样就能正常编译,并且可以直接把binnMode传给xiSetParamInt函数。
为什么原来的写法不行?
在C++11及之后的标准里,字符串字面量(比如宏XI_PRM_BINNING_HORIZONTAL_MODE展开后的"binning_horizontal_mode")的类型是**const char[N]**(其中N是字符串的字符总数加1,用来存储终止符\0)。
你之前用char*来接收它,相当于试图把一个带const限定的指针隐式转换为非const类型——这在C中是被禁止的(C语言曾经允许这种隐式转换,但C为了类型安全取消了这个特性,避免你意外修改只读内存中的字符串字面量,那会导致未定义行为,比如程序崩溃)。
额外说明
刚好你的目标函数xiSetParamInt的第二个参数就是const char* prm,和const char*类型的变量完全匹配,不需要任何额外的转换操作,这是最安全、最符合标准的写法。
如果有人非要用char*(非常不推荐!),可以用const_cast强制转换:
char* binnMode = const_cast<char*>(XI_PRM_BINNING_HORIZONTAL_MODE);
但再次提醒:字符串字面量通常存储在只读内存区域,一旦尝试修改它的值,程序会出现不可预料的错误。在你的场景里完全没有必要这么做,坚持用const char*才是正确选择。
内容的提问来源于stack exchange,提问作者Matthias Pospiech
相关产品推荐
相关产品推荐

