2010-11-21 6 views
1

(extrait de accéléré C++)Le code ne compile pas à cause de blocs anonymes imbriqués?

Pourquoi le code suivant fonctionne pas:

#include <iostream> 
#include <string> 

int main() { 
    { 
     const std::string s = "a string"; 
     std::cout << s << std::endl; 

     { 
      const std::string s = "another string"; 
      std::cout << s << std::endl; 
     } 
    } 
} 

Suis-je pas le droit de nid blocs anonymes en C++? Lorsque vous essayez de compiler la source, gcc me donne l'erreur suivante (que je ne peux faire aucun sens de):

hello: In function `_start': 
(.text+0x0): multiple definition of 
`_start' 
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crt1.o:(.text+0x0): 
first defined here 
hello:(.rodata+0x0): multiple 
definition of `_fp_hw' 
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crt1.o:(.rodata+0x0): 
first defined here hello: In function 
`_fini': (.fini+0x0): multiple 
definition of `_fini' 
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crti.o:(.fini+0x0): 
first defined here 
hello:(.rodata+0x4): multiple 
definition of `_IO_stdin_used' 
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crt1.o:(.rodata.cst4+0x0): 
first defined here hello: In function 
`__data_start': (.data+0x0): multiple 
definition of `__data_start' 
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crt1.o:(.data+0x0): 
first defined here hello: In function 
`__data_start': (.data+0x4): multiple 
definition of `__dso_handle' 
/usr/lib/gcc/i486-linux-gnu/4.4.3/crtbegin.o:(.data+0x0): 
first defined here hello: In function 
`_init': (.init+0x0): multiple 
definition of `_init' 
/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/crti.o:(.init+0x0): 
first defined here /tmp/cchh83A6.o: In 
function `main': 
hello.cpp:(.text+0x0): multiple 
definition of `main' 
hello:(.text+0xb4): first defined here 
/usr/lib/gcc/i486-linux-gnu/4.4.3/crtend.o:(.dtors+0x0): 
multiple definition of `__DTOR_END__' 
hello:(.dtors+0x4): first defined here 
/usr/bin/ld: warning: Cannot create 
.eh_frame_hdr section, --eh-frame-hdr 
ignored. /usr/bin/ld: error in 
hello(.eh_frame); no .eh_frame_hdr 
table will be created. collect2: ld 
returned 1 exit status
+0

Quelle (s) commande (s) utilisez-vous pour compiler et lier ceci? En outre, si vous supprimez le "bloc anonyme", avez-vous toujours l'erreur? –

+1

L'erreur semble être dans votre environnement de construction, pas dans votre code. S'il vous plaît poster quelques informations sur votre IDE et la configuration du bâtiment (un makefile?) Et la commande de construction générée (vous pourriez le voir dans une console juste avant la sortie que vous avez posté). – Kos

+0

À quoi ressemblerait un bloc nommé (non anonyme)? :) – fredoverflow

Répondre

3

Vous semblez être lié à 2 ou plusieurs fichiers objet (ou fichiers .a) qui définissent les mêmes choses. Si vous liez l'un ou l'autre, votre problème de lien disparaîtra.

+0

D'oh. Tu as raison, c'était le problème. Au lieu de 'g ++ -o hello hello.cpp' il a écrit' g ++ bonjour hello.cpp'. – helpermethod

Questions connexes