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