2015-03-25 3 views
1

Скажем, у меня есть два файла:GCC - ошибка для различных классов с тем же именем

a.cpp

class C { int x; }; 

b.cpp

class C { string s; }; 

Я хочу, чтобы получить ошибку об этом во время моего процесса сборки. Что мне делать? (Я не против использования какого-либо внешнего инструмента).

+0

Любопытный * почему * вы хотите, чтобы это была ошибка. –

+0

См. Мой комментарий к ответу Алона. Основная проблема - поврежденные vtables, вторичная проблема - передать Cs между различными единицами компиляции, которые ожидают другого представления. – tohava

+0

Итак, собираетесь ли вы ссылаться на глобальные переменные типа 'C', объявленные в другой единице компиляции? – tonso

ответ

1

Это связано с тем, что каждый файл c/cpp является единицей компиляции, отделенной от каждой, если вы действительно хотите проверить, что этого не происходит, вы можете objdump * .o-файлы, сгенерированные компилятором, проанализировать их с некоторым скриптом, и видите, что они не коррелируют.

+0

Я подумал об этом решении. Это не будет работать в случае выше, но это будет работать для более опасного случая. Вышеприведенный случай относительно безвреден, так как разные разные модули не пытаются передать объект друг другу и каждый из них имеет другой класс. Более опасным случаем является то, что объект имеет виртуальные функции, а затем gcc создает поврежденную таблицу vtable для одного из классов. Этот случай можно поймать путем поиска символа vtable левая сторона – tohava

+0

Фактически, даже если они не передают его, но каждый определяет его по-другому, вы все равно получите неожиданное поведение (скажем, если не указано) – Alon

+0

с точки зрения стандарта C++ это правда, но я верю (может быть, ошибочно), что gcc обрабатывает это нормально. – tohava

Смежные вопросы