以下 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 声明的方式?
这里有两个问题。
首先,MISRA-C 要求代码应该是标准 C,所以你必须创建一个与使用标准 C 规则的偏差。
其次,MISRA-C 不喜欢您在文件范围内声明非
static
的变量。全局变量不仅受到 MISRA-C 的反对,所以问问自己是否真的必须在各处公开这个变量,或者是否可以通过 setter/getter 函数来访问它。
话虽这么说,我相信
__attribute__
的工作方式与其他类型限定符非常相似。你可以把它写在声明的开头或结尾等等。所以写起来应该没有问题,例如:
extern const volatile uint8_t attributeVariable __attribute__ ((section(".abc.dfe")));
我并不希望 5 年后你会遇到同样的问题,但未来我会在对话中添加一些内容。我没有在任何地方找到它,但是通过测试,我可以向您保证,使用 gcc,您可以从 extern 声明中删除属性部分。从文档来看,这几乎似乎相反,因为他们总是谈论“声明”。 对我来说,关于在内存中定位它的属性出现在定义中有点有意义。
附注是的,它不是标准 C,但假设您正在谈论 MISRA:2012,它明确指出,如果您证明您使用的是正确的编译器,则可以使用 C 的扩展:D