0

我想知道,如果可能的话,如何根据函数的返回值的类型转换如何对应于传递的参数之一来生成编译器警告。在我的示例中,如果函数调用的类型转换为小于“Bytes”参数定义的任何值,我想生成编译器警告。这在使用 MSP430 的 IAR 的 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;
}

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

4

3 回答 3

1

对此有一个简单的答案:你不能。原因是您无法确定函数返回后返回值将被类型转换为什么。

于 2012-10-01T15:34:41.023 回答
1

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

可能最好的解决方案是:

#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)
于 2012-10-01T15:34:49.727 回答
0

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

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

于 2012-10-01T15:34:57.490 回答