主要内容

MISRA C:2012 Rule 8.4

A compatible declaration shall be visible when an object or function with external linkage is defined

描述

规则定义

A compatible declaration shall be visible when an object or function with external linkage is defined 1 .

理由

如果在定义对象或函数时某个声明可见,编译器就可以检查该声明与上述定义是否兼容。

此规则根据 MISRA C:2012 Rule 8.5 强制应用以下做法:在头文件中声明对象(或函数)并在定义或使用对象(或函数)的源文件中包括头文件。

Polyspace 实现

此规则检查项检测下列情形:

  • 定义了对象或函数,但前面没有声明。

  • 对象或函数的声明与定义之间存在数据类型不匹配。这种不匹配还会导致编译错误。

此检查项现在会标记暂定的定义(未使用 extern 设定符进行声明且未显式定义的变量)。为避免违反规则,应先声明变量 static(仅在单个文件中定义),或者先声明变量 extern 并在声明后面加上定义。

报告中的补充消息

  • variable_name 变量的全局定义前面没有声明。

  • 在定义函数 function_name 时,兼容的原型不可见。

故障排除

如果您预期会出现违规,但未看到该违规,请参阅诊断为何编码规范违规未按预期显示

示例

全部展开

头文件:


/* file.h */
extern int var2; 
void func2(void);

源文件:


/* file.c */
#include "file.h"

int var1 = 0;    /* Non compliant */
int var2 = 0;    /* Compliant */

void func1(void) {   /* Non compliant */
}

void func2(void) {   /* Compliant */
}

在此示例中,var1func1 的定义不合规,因为它们的前面没有声明。

void func(int param1, int param2);

void func(int param1, unsigned int param2) { /* Non compliant */
}

在此示例中,func 的定义与其声明具有不同的参数类型。声明不匹配可能会导致编译错误。Polyspace® 会标记此不匹配。

检查信息

组:声明和定义
类别:必需
AGC 类别:建议

版本历史记录

在 R2014b 中推出


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.