这是 UB 外部的附加常量吗?

Is this aditional const on extern an UB?

我有以下内容:

//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() {}

我在 extern 声明中添加了一个额外的 const。添加此 const 将是 UB?

如果不是 UB,在 main 里面做下面的事情就是 UB?

(*(struct A**)&a) = malloc(sizeof(struct A));

是的。来自附件 J.2:

  • Two declarations of the same object or function specify types that are not compatible (6.2.7).

和 6.2.7 ¶2:

All declarations that refer to the same object or function shall have compatible type; otherwise, the behavior is undefined.

和 6.7.3 ¶10:

For two qualified types to be compatible, both shall have the identically qualified version of a compatible type; the order of type qualifiers within a list of specifiers or qualifiers does not affect the specified type.

考虑以下编译单元:

#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,然后重新启用保护。实现允许这种可能性是否有用将取决于实现声称适合的目的范围,这是委员会不可能知道的事情,但编译器作者应该知道。