0

可能であれば、関数の戻り値の型キャストが渡されたパラメーターの1つにどのように対応するかに基づいて、コンパイラー警告を生成する方法を知りたいです。私の例では、関数呼び出しが「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;
}

編集:nullポインターを返すことも検討しましたが、それは静的変数が必要であることを意味します。やりたくない

4

3 に答える 3

1

これに対する簡単な答えが 1 つあります。それはできません。その理由は、関数が戻った後に戻り値が何に型キャストされるかがわからないためです。

于 2012-10-01T15:34:41.023 に答える
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)
于 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 に答える