MISRA C:2012 Rule 17.3

Функция не должна объявляться неявно

Описание

Определение правила

Функция не должна объявляться неявно.

Объяснение

Неявное объявление происходит, когда вы вызываете функцию перед объявлением или определением ее. Когда вы объявляете функцию явным образом перед вызовом, компилятор может соответствовать типам аргументов и возвращений с типами параметров в объявлении. Если происходит неявное объявление, компилятор делает предположения о типах аргументов и возвратах. Например, он принимает тип возврата int. Допущения могут не совпадать с ожидаемым и вызывать нежелательные преобразования типов.

Дополнительное сообщение в отчете

Функция 'XX' не имеет полного видимого прототипа по вызову.

Поиск и устранение проблем

Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».

Примеры

расширить все

#include <math.h>

extern double power3 (double val, int exponent);
int getChoice(void);

double func() {
    double res;
    int ch = getChoice();
    if(ch == 0) {
        res = power(2.0, 10);    /* Non-compliant */
    }
    else if( ch==1) {
        res = power2(2.0, 10);   /* Non-compliant */
    }
    else {
        res = power3(2.0, 10);   /* Compliant */
        return res;
    }
}

double power2 (double val, int exponent) {
    return (pow(val, exponent));
}

В этом примере правило нарушается, когда в коде вызывается функция, которая не объявлена. Даже если определение функции существует позже в коде, происходит нарушение правила.

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

  • Объявите функцию с extern ключевое слово в текущем файле.

  • Объявить функцию в заголовочном файле и включить заголовочный файл в текущий файл.

Проверяйте информацию

Группа: Функция
Категория: Обязательная
Категория AGC: Обязательно
Введенный в R2014b