This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS:CAST错误:类型#43-D操作数类型不兼容

Guru**** 2534260 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/570399/ccs-cast-error-type-43-d-operand-types-are-incompatible

工具/软件:Code Composer Studio

您好,

编译以下宏时,我从CCS 6.2 .0.0.005万 收到“#43-D操作数类型不兼容”警告:

#define REINTERPRETER(端口)((( UINT32_t )端口%2)? ( DIO_PORT_OD_Interruptable_Type *)端口:( DIO_PORT_EVENT_Interruptable_Type *)端口)

我的代码按预期工作,但我更喜欢消除此警告。 你们能帮我实现这一目标吗?

提前感谢!

亚历山大·科斯塔

=============================================================================================================================================

/*
* GPIO。c
*
创建时间:2017年1月27日
* 作者:Alexandre.Costa
*/

#include "gPIO.h" 
#define set_bit(value, bit)( value |=(1 << bit ))
#define clr_bit(value, bit)( value &=~(1 << bit ))
#define Get_bit(value, bit)(( value >> bit)& 0x1)
#define REINTERPRETER(端口)((( UINT32_t )端口%2)? ( DIO_PORT_OD_Interruptable_Type *)端口:( DIO_PORT_EVENT_Interruptable_Type *)端口) void gPIO_Init ( gPIO_Config * config ) { /*选择了通用I/O */ CLR_BIT ( REINTERPRETER ( CONFIG ->端口)-> SEL0,CONFIG -> Pin ); CLR_BIT ( REINTERPRETER ( CONFIG ->端口)-> SEL1,CONFIG ->引脚); /*将通用I/O配置为输入或输出*/ 如果( config -> AsInput ) CLR_BIT ( REINTERPRETER ( CONFIG ->端口)-> DIR,CONFIG ->引脚); 否则 set_bit ( REINTERPRETER ( config -> Port )-> DIR,config -> Pin ); /*配置上拉或下拉电阻器*/ GPIO_ResistorConfig ( config ); :P1 /*获取或设置pin值*/ GPIO更新值( config ); } void GPIO ResistorConfig ( GPIO配置*配置){ /*上拉或下拉电阻器启用寄存器*/ 如果( config -> AsInput ) { 如果( config ->阻器_配置==不带电阻器) CLR_BIT ( REINTERPRETER ( CONFIG ->端口)-> REN,CONFIG ->引脚); 否则 { set_bit ( REINTERPRETER ( config -> Port )-> REN,config -> Pin ); 如果( config -> Resister_Config == a_pulldown ) CLR_BIT ( REINTERPRETER ( config ->端口)->输出,config ->引脚); 否则,如果( config ->阻器_配置== a_pullup ) set_bit ( REINTERPRETER ( config -> Port )-> Out,config -> Pin ); } } } 作废GPIO _UpdateValue ( GPIO配置*配置){ 如果( config -> AsInput ) config -> value = Get_bit ( REINTERPRETER ( config -> Port )-> In,config -> Pin ); 否则 { 如果( config -> value ) set_bit ( REINTERPRETER ( config -> Port )-> Out,config -> Pin ); 否则 CLR_BIT ( REINTERPRETER ( config -> Port )-> Out,config -> Pin ); } }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    有一种方法可以抑制此诊断...

    Alexandre Costa84 说:
    "#43-D操作数类型不兼容"警告[/QUOT]

    但是,首先,我建议你仔细研究一下它为什么会被发射。  以下是一种很好的方法。

    像现在一样生成源文件,但添加选项--preproc_with注释。 这将导致编译器预处理代码(句柄#include,#define等),将此预处理代码写入具有相同基本名称加扩展名.pp的文件,然后停止。  然后以同样的方式编译该. pp文件,但删除选项--preproc_with注释,并添加选项 --verbose_diagnostics。  发出相同的诊断。  但是,预处理后,您还会看到问题源行,其中包含一个^字符,指向问题的开始位置。  现在,您可能已经清楚地了解诊断出现的原因。

    要取消此诊断,请添加生成选项--diag_suppress=43。  值43来自诊断本身。  有关此详细信息的详细信息,以及在源代码中使用#pragma禁用此诊断的方法,可在编译器手册中标题为 Understanding Diagnostic Messages的部分中找到。  我不知道您使用哪种编译器,因此 它链接到所有手册

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当?运算符的两个结果是不兼容的类型时,解析器不喜欢它。 只有通过确保两个结果具有相同的类型(例如将两者都转换为void*),才能自然地消除警告。 但是,你不能只是取消对REINTERPRETER结果的推断。 您可以使用类似的宏,假设每个字段(如SEL0)在奇数与偶数情况下具有相同的类型:
    #define REINTERPRETER_FIELD (端口,田地)(端口%2? ((ODD*)端口)->字段:(偶数*)端口->字段)
    CLR_BIT ( REINTERPRETER_FIELD ( CONFIG ->端口, SEL0), CONFIG -> Pin );
    或者,只需禁用诊断程序。