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