LINUX.ORG.RU

Странное поведение gcc и g++


0

0

есть 3 файла.
1.h:
#ifndef H
#define H

const char a []= "a";

#endif

1.c и 2.c:
#include "1.h"

компилируем: gcc -c 1.c && gcc -c 2.c
объеденяем: gcc -shared 1.o 2.o
получаем ошибку:
multiple definition of `a`

если скомпилировать и "объеденить" с помощью g++ - то ошибка не выдается, однако в получившейся библиотеке получается два символа a:
$ nm a.out| grep "r a"
00000734 r a
00000738 r a

я конечно понимаю, что компилятору неоткуда знать сколько сишных файлов я буду компилировать, и чем отличаются два символа с одним именем в одном объектнике, но все же g++ справляется с этим, а gcc нет?

насколько я понял компиляция g++ от gcc отличается только вызовом препроцессора с различными define'ами и вызовом либо cc1 либо cc1plus.
так почему такую возможность не реализовали в gcc?

Понятно, что один из вариантов решения вопроса символов с одинаковыми именами - создать столько копий, сколько упоминаний, но почему не происходит оптимизация?

заметил на версии 2.95.4, проверял на 4.0.3 - та же штука.

★★

это не вопрос справляется/не справляется. В стандарте С++ есть строка Objects declared const and not explicitly declared extern have internal link- age. А в С такой строки нет

dilmah ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.