兼容声明 __attribute__ ((section(".abc.dfe"))) const volatile uint8 attributeVariable = 0; - 符合 MISRA

问题描述 投票:0回答:2

以下 const 在项目文件中声明,我正在测试是否违反 MISRA 准则

__attribute__ ((section(".abc.dfe"))) const volatile uint8 attributeVariable = 0;

MISRA 测试产生以下消息

A compatible declaration shall be visible when an object or function with external linkage is defined. 
Global definition of 'attributeVariable ' variable has no previous declaration.

我已经修复了其他全局定义,这些定义没有使用

__attribute__
关键字,将其声明为

extern const volatile uint8 attributeVariable;

在头文件中。我不确定使用

__attribute__
关键字时是否可以以相同的方式在标头中编写声明。
__attribute__
是否会影响我编写变量的 extern 声明的方式?

c++ c embedded misra
2个回答
1
投票

这里有两个问题。

首先,MISRA-C 要求代码应该是标准 C,所以你必须创建一个与使用标准 C 规则的偏差。

其次,MISRA-C 不喜欢您在文件范围内声明非

static
的变量。全局变量不仅受到 MISRA-C 的反对,所以问问自己是否真的必须在各处公开这个变量,或者是否可以通过 setter/getter 函数来访问它。

话虽这么说,我相信

__attribute__
的工作方式与其他类型限定符非常相似。你可以把它写在声明的开头或结尾等等。所以写起来应该没有问题,例如:

extern const volatile uint8_t attributeVariable __attribute__ ((section(".abc.dfe")));

0
投票

我并不希望 5 年后你会遇到同样的问题,但未来我会在对话中添加一些内容。我没有在任何地方找到它,但是通过测试,我可以向您保证,使用 gcc,您可以从 extern 声明中删除属性部分。从文档来看,这几乎似乎相反,因为他们总是谈论“声明”。 对我来说,关于在内存中定位它的属性出现在定义中有点有意义。

附注是的,它不是标准 C,但假设您正在谈论 MISRA:2012,它明确指出,如果您证明您使用的是正确的编译器,则可以使用 C 的扩展:D

© www.soinside.com 2019 - 2024. All rights reserved.