exponenta event banner

MISRA C:2012 Правило 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 ключевое слово в текущем файле.

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

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

Группа: Функция
Категория: Обязательно
Категория СМЖЛ: обязательная
Представлен в R2014b