我有一个S8类型定义,以及一个使用该定义类型的调试打印功能。
typedef signed char S8;
S32 CH_COM_DebugPrintf(const S8 *rpc_format, ...)
当我调用下面的printf函数时,
CH_COM_DebugPrintf("TunerCallback device id:[%d]\r\n", ri_Device);
CH_COM_DebugPrintf("TunerCallback event type:[%d]\r\n", renm_EventType);
编译时,它会发出错误,出了什么问题?
arm-hisiv200-linux-g++ -I./gtest/include -I../drv/include -g -Wall -Wextra -c src/chdrv_tunner_test.cc
src/chdrv_tunner_test.cc: In function 'void CHDRV_TEST_TunerCallback(S32, CHDRV_TUNER_EVENT_TYPE_e, void*)':
src/chdrv_tunner_test.cc:30: error: invalid conversion from 'const char*' to 'const S8*'
src/chdrv_tunner_test.cc:30: error: initializing argument 1 of 'S32 CH_COM_DebugPrintf(const S8*, ...)'
src/chdrv_tunner_test.cc:31: error: invalid conversion from 'const char*' to 'const S8*'
src/chdrv_tunner_test.cc:31: error: initializing argument 1 of 'S32 CH_COM_DebugPrintf(const S8*, ...)'
src/chdrv_tunner_test.cc: At global scope:
它没有用,因为我强制转换为(const S8 *),请给我一些帮助。非常感谢你的帮助。
CH_COM_DebugPrintf((S8*)"TunerCallback device id:[%d]\r\n", ri_Device);
CH_COM_DebugPrintf((S8*)"TunerCallback event type:[%d]\r\n", renm_EventType);
答案 0 :(得分:3)
根据standard(3.9.1基本类型):
Plain char,signed char和unsigned char是三种不同的类型。
"text"
形式的字符串文字由const char
而非const signed char
或const unsigned char
组成。
由于它们是指针类型,因此您可以轻松地将它们相互转换,但这不会隐式完成。
答案 1 :(得分:3)
字符串文字的类型为char []
,数组为char
。当传递给这样的函数时,它将被计算为指向其第一个元素char *
的指针。
char
和signed char
是不同的类型(即使您的平台上已签署char
)。指向一个的指针不能隐式转换为指向另一个的指针。
如果要在没有显式转换的情况下传递字符串文字,则应使用第一个参数const char *
声明您的函数。
答案 2 :(得分:0)
您可以尝试:
CH_COM_DebugPrintf((S8*)"TunerCallback device id:[%du]\r\n", ri_Device);
CH_COM_DebugPrintf((S8*)"TunerCallback event type:[%du]\r\n", renm_EventType);
以无符号值打印
也许您应该使用typedef unsigned char S8;
而不是signed
值,因为设备ID和回调类型表示在语义上是正值。