Des objects constants avec une durée de stockage statique et des initialiseurs égaux et constants peuvent-ils être fusionnés?

Considérons deux objects avec une durée de stockage statique et des initialiseurs égaux et constants:

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

Est-il valide pour un compilateur de combiner ces éléments de manière à ce que &a == &b ?

(Pour le contexte, je pensais utiliser des objects constants statiques pour obtenir des adresses uniques à utiliser comme valeurs de pointeur sentinel. S’il est légal pour un compilateur de combiner de tels objects et que j’utilise la même valeur constante pour deux de ces objects, les adresses pourraient alors: être égal et je ne peux pas les utiliser comme valeurs sentinelles.)

Les pointeurs doivent comparer non égal. Voir C99 6.5.9, paragraphe 6:

Deux pointeurs se comparent égaux si et seulement si les deux pointeurs sont nuls, les deux pointeurs pointent sur le même object (y compris un pointeur sur un object et un sous-object au début) ou une fonction, les deux pointeurs pointent sur le dernier élément du même tableau object, ou l’un est un pointeur sur un point situé au-delà de la fin d’un object tableau et l’autre est un pointeur sur le début d’un object tableau différent qui suit immédiatement le premier object tableau de l’espace adresse.

Non, la norme interdit cela. Les objects distincts doivent avoir des adresses distinctes. Dans const char a[]="abc", b[]="abc"; , a et b sont atsortingbués à des adresses différentes. Ceci est également vrai si ce sont des pointeurs: dans const char *a="abc", *b="abc", a and b` sont également atsortingbués à des adresses différentes; la constante de chaîne sur laquelle ils pointent peut être un seul tableau de constantes, comme s’il s’agissait d’un object nommé.