Генерация предупреждения компилятора на ошибках определенной пользовательской функции.

StackOverflow https://stackoverflow.com//questions/12676304

Вопрос

Я хотел бы знать, если это возможно, как создать предупреждение компилятора на основе того, как обратно обработанное значение функции соответствует одному из прошедших параметров.В моем примере я хотел бы сгенерировать предупреждение компилятора, если вызов функции находится в типовом вызове до чего-либо меньше, чем то, что определяется параметром «байт».Это используется в программе C с использованием IAR для MSP430

Например:

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

Редактирование: Я также считал возвращение нулевого указателя, но это означает, что мне нужна статическая переменная.который я не хочу делать

Это было полезно?

Решение

Есть один простой ответ на это: вы не можете.Причина, находящаяся в том, что вы не можете сказать, что возвращаемое значение будет найдено после возврата функции.

Другие советы

Нет, это невозможно.Компилятор недостаточно умно, чтобы определить выходное значение в момент компиляции.Одна вещь, которую вы могли бы сделать, было бы предложить несколько функций с различными типами возврата и делать в себе внутри них (что бы ловить проблемы во время выполнения).Конечно, в встроенной среде этот вид дублирования кода будет плохой.

Вероятно, лучшее решение будет делать:

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

Вы можете генерировать пользовательские предупреждения или ошибки с #warning и #Error, но и время компиляции.Таким образом, вы не можете применить это к коду выполнения.

Вот более объяснение. http://mobiledevelopertips.com//s/using-error-and.com- Ворчанные компиляторы-Директивы .html

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top