我有以下内容:
//h.h file
#pragma once
struct A { int x; };
//a.c file
#include "h.h"
struct A* a;
//b.c
#include "h.h"
extern struct A* const a;
int main() {}
我在const
声明上添加了额外的extern
。将此const
添加为UB吗?
如果不是UB,则在main
内部执行以下操作将是UB?
(*(struct A**)&a) = malloc(sizeof(struct A));
是。从附件J.2:
- 同一对象或函数的两个声明指定了不兼容的类型(6.2.7)。
和6.2.7¶2:
引用同一对象或函数的所有声明应具有兼容的类型;否则,行为是不确定的。
和6.7.3¶10:
要使两个合格的类型兼容,两个都应具有兼容类型的相同合格版本;指定符或限定符列表中的类型限定符的顺序不影响指定的类型。
考虑以下编译单元:
#include "h.h"
extern struct A* const a;
void externalFunction(void);
int myFunction(void)
{
struct A *p1,*p2;
p1 = a;
externalFunction();
p2 = a;
return p2-p1;
}
该标准将允许编译器根据const
指令假设,由于调用a
而不会更改externalFunction
的值。注意,它不考虑允许外部函数修改a
的可能性是否有优势。例如,在某些平台上,a
通常可以被写保护,但是外部功能(也许用另一种语言编写)可能能够禁用写保护,修改a
,然后重新启用保护。对于允许这种可能性的实现是否有用将取决于实现声称适合的目的范围,这是委员会可能无法知道的,但是哪个编译器作者应该知道。