【问题标题】:Generating a compiler warning on user defined function typecast errors对用户定义的函数类型转换错误生成编译器警告
【发布时间】:2012-10-01 15:28:35
【问题描述】:

如果可能的话,我想知道如何根据函数返回值的类型转换与传递的参数之一的对应关系来生成编译器警告。在我的示例中,如果函数调用的类型转换为小于“Bytes”参数定义的任何值,我想生成编译器警告。这用于将 IAR 用于 MSP430 的 C 程序中

例如:

(INT16U)GetINTU(VarPtr, 2); // This is ok
(INT16U)GetINTU(VarPtr, 4); // generates warning
(INT32U)GetINTU(VarPtr, 4); // This is ok
(INT32U)GetINTU(VarPtr, 8); // generates warning
(INT64U)GetINTU(VarPtr, 4); // This is ok

这里是所说的功能:

INT64U GetINTU(INT8U* Address, INT8U Bytes)
{
INT64U Value = 0;
if(Bytes<=8)
    {
    do
        {
        Value += ((INT64U)(*Address++))<<(--Bytes<<3);  
        }while(Bytes);
    }
return Value;
}

编辑:我也考虑过返回一个空指针,但这意味着我需要一个静态变量。我不想这样做

【问题讨论】:

    标签: c casting compiler-warnings msp430


    【解决方案1】:

    对此有一个简单的答案:你不能。原因是你不知道函数返回后返回值会被类型转换成什么。

    【讨论】:

    • 我希望错误出现在编译时。我希望它比较演员表和“字节”“字节”的值将始终传递硬编码数字。 1、2、4、8,永远不会是变量。这就是为什么我认为可能有办法做到这一点。
    • @Jeremy C++ 可以使用模板。唉,不是在普通的 C 中,甚至没有使用宏。
    【解决方案2】:

    不,这是不可能的。编译器不够聪明,无法在编译时确定输出值。您可以做的一件事是提供具有不同返回类型的多个函数并在其中执行断言(这会在运行时发现问题)。当然,在嵌入式环境中,这种代码重复会很糟糕。

    可能最好的解决方案是:

    #define GetINT8U(addr, bytes) assert(bytes <= 1), (INT8U)GetINTU(addr, bytes)
    #define GetINT16U(addr, bytes) assert(bytes <= 2), (INT16U)GetINTU(addr, bytes)
    #define GetINT32U(addr, bytes) assert(bytes <= 4), (INT32U)GetINTU(addr, bytes)
    #define GetINT64U(addr, bytes) assert(bytes <= 8), (INT64U)GetINTU(addr, bytes)
    

    【讨论】:

    • 我希望错误出现在编译时。我希望它比较演员表和“字节”“字节”的值将始终传递硬编码数字。 1、2、4、8,永远不会是变量。这就是为什么我认为可能有办法做到这一点。
    • @Jeremy 我不知道在 C 中这样做的方法。也许在定义中使用 ifdefs 有一些奇怪的方法,尽管我不知道这种方法会是什么.您会以某种方式将#if bytes > 1 #error #endif 放在#define 中。不确定如何或是否可能。
    【解决方案3】:

    您可以使用#warning 和#error 生成自定义警告或错误,但需要编译时间。所以你不能把它应用到运行时代码。

    这里有更多解释。 http://mobiledevelopertips.com/c/using-error-and-warning-compiler-directives.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      • 2020-04-11
      • 1970-01-01
      • 1970-01-01
      • 2013-07-22
      • 1970-01-01
      相关资源
      最近更新 更多