Domanda

Vorrei saperlo, se è possibile, come generare un avviso di compilatore in base al modo in cui il valore di restituito di una funzione si typecasting corrisponde a uno dei parametri passati.Nel mio esempio, vorrei generare un avviso di compilatore se la chiamata della funzione è stata chiamata a nulla in meno di quanto è definito dal parametro "Bytes".Questo è usato in un programma C usando IAR per MSP430

Ad esempio:

(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
.

Ecco la funzione detta:

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

Modifica: ho anche preso in considerazione il restituzione di un puntatore null ma significa che ho bisogno di una variabile statica.quale non voglio fare

È stato utile?

Soluzione

C'è una semplice risposta a questo: non puoi.Il motivo è che non è possibile dire quale sarà il valore di ritorno da ripetere dopo che la funzione restituisce.

Altri suggerimenti

No, non è possibile.Il compilatore non è abbastanza intelligente da determinare il valore di uscita a tempo di compilazione.Una cosa che potresti fare sarebbe quella di offrire più funzioni con diversi tipi di ritorno e fare affermazioni all'interno di loro (che catturerebbero problemi in fase di esecuzione).Naturalmente, in un ambiente embedded questo tipo di duplicazione del codice sarebbe cattiva.

Probabilmente la soluzione migliore sarebbe fare:

#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)
.

È possibile generare avvertenze o errori personalizzati con #Warning e #Error ma il suo tempo di compilazione.Quindi non puoi applicare questo al codice di runtime.

Qui è più spiegazione. http://mobilededeldelsps.com/c/using-error- e-wardn-compiler-direttivi.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top