2010-12-01 16 views

Respuesta

10

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.

+2

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. –

+0

@Steve: ¡Vaya! Tienes razón. Edité mi publicación en respuesta a tu comentario. –

1

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

+4

En C, en realidad es UB. :) –

+0

@Prasoon: ¿Por qué gcc me da este error? – sje397

+1

Debido a que el Comportamiento no definido significa ** cualquier cosa ** puede suceder. Eso incluye una implementación que emite un mensaje de error. :) –

Cuestiones relacionadas