我想知道,如果可能,如何根据函数的返回值的类型转换对应于传递的参数之一生成编译器警告。在我的示例中,如果函数调用被类型转换为小于“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;
}
编辑:我还考虑过返回一个空指针,但这意味着我需要一个静态变量。我不想做什么
答案 0 :(得分:1)
有一个简单的答案:你做不到。原因是你无法告诉函数返回后返回值将被强制转换为什么。
答案 1 :(得分: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)
答案 2 :(得分:0)
您可以使用#warning和#error生成自定义警告或错误但编译时间。所以你不能将它应用于运行时代码。
这里有更多解释。 http://mobiledevelopertips.com/c/using-error-and-warning-compiler-directives.html