Se hace un intento de cambiar la vinculación de un nombre i
en este código. ¿Es legal en C/C++?Cambiando la vinculación de un nombre
static int i = 2;
int i;
int main()
{
return 0;
}
Se hace un intento de cambiar la vinculación de un nombre i
en este código. ¿Es legal en C/C++?Cambiando la vinculación de un nombre
static int i = 2;
int i;
int main()
{
return 0;
}
en C++ está mal formada, su código (que tiene múltiples definiciones de variable i
) es decir, se requiere un compilador conforme estándar para emitir un mensaje de error
3.2.1 (C++ 03)
No translation unit shall contain more than one definition of any variable, function, class type, enumeration type or template.
En su código C99 invoca un comportamiento indefinido debido a 6.2.2/7 dice
If, within a translation unit, the same identifier appears with both internal and external linkage, the behavior is undefined.
En C++ tiene la respuesta correcta por el motivo equivocado. El problema es que ambas declaraciones de 'i' en la pregunta son definiciones, su vinculación es irrelevante (aunque por lo que vale la pena, ambas son internas, 7.1.1/6). 'static int i = 2; extern int i; 'estaría bien (3.5/6), y' extern int i; static int i = 2; 'no es correcto por el motivo que das, los enlaces no concuerdan. –
@Steve: ¡Vaya! Tienes razón. Edité mi publicación en respuesta a tu comentario. –
No. En CI conseguir este error:
test.c:2: error: non-static declaration of ‘i’ follows static declaration
test.c:1: note: previous definition of ‘i’ was here
En C++, los siguientes:
test.cpp:2: error: redefinition of ‘int i’
test.cpp:1: error: ‘int i’ previously defined here
En C, en realidad es UB. :) –
@Prasoon: ¿Por qué gcc me da este error? – sje397
Debido a que el Comportamiento no definido significa ** cualquier cosa ** puede suceder. Eso incluye una implementación que emite un mensaje de error. :) –
¿No lo intentas? – sje397
¿Qué es C/C++? . –
@Charles C y C++. –