-1

我有一个 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);
4

3 回答 3

3

根据标准(3.9.1 基本类型):

普通字符、有符号字符和无符号字符是三种不同的类型。

形式的字符串文字"text"由 组成const char而不是const signed charconst unsigned char

由于它们是指针类型,您可以轻松地将它们相互转换,但这不会隐式完成。

于 2013-06-13T08:52:13.887 回答
3

字符串文字的类型是char []的数组char。当传递给这样的函数时,它将被评估为指向其第一个元素 a 的指针char *

char并且signed char是不同的类型(即使char在您的平台上签名)。指向一个的指针不能隐式转换为指向另一个的指针。

您的函数应该使用第一个参数声明,就const char *好像您想在不进行显式转换的情况下传递字符串文字一样。

于 2013-06-13T08:53:04.720 回答
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 和回调类型表示在语义上是正值。

于 2013-06-13T08:54:09.773 回答