具有静态存储持续时间的常量对象和相等的常量初始化器是否可以合并?

考虑两个具有静态存储持续时间和相等的常量初始化器的对象:

static const int a = 50; static const int b = 50; 

编译器是否有效组合这些&a == &b

(对于上下文,我考虑使用静态常量对象来获取唯一地址以用作标记指针值。如果编译器合并这些对象是合法的,并且我对两个这样的对象使用相同的常量值,那么地址可以是平等的,我不能用它们作为哨兵价值。)

指针必须比较不相等。 见C99 6.5.9第6段:

两个指针比较相等,当且仅当两个都是空指针时,两者都是指向同一对象的指针(包括指向对象的指针和在其开头的子对象)或函数,两者都是指向同一数组的最后一个元素之后的指针对象,或者一个是指向一个数组对象末尾的指针,另一个是指向不同数组对象的开头的指针,该数组对象恰好跟随地址空间中的第一个数组对象。

不,标准禁止这样做。 不同的对象必须具有不同的地址。 在const char a[]="abc", b[]="abc";ab分配在不同的地址。 如果它们是指针也是如此:在const char *a="abc", *b="abc", a and b`也分配在不同的地址; 它们指向的字符串常量可以是单个常量数组,就像它是一个命名对象一样。