2016-02-22 8 views
-2

Скажем, у меня есть глобальная переменная, объявленная в заголовке:Выведение тип глобальной переменной

extern long global_var; 

было бы разумно, чтобы компилятор затем вывести тип, если переменная определена в источнике:

auto global_var; 

Я вижу, по крайней мере, некоторые плюсы:

  • избежать дублирования кода, то есть, когда мы изменяем тип в заголовке, то не должны с висящий его в исходном файле
  • меньше ошибок, если переменная не объявлена ​​ранее, он не будет компилировать

Подобное может работать для статических членов класса.

Но в настоящее время это не представляется возможным. Существуют ли недостатки, которые перевешивают эти выгоды?

+1

* Каким образом компилятор мог бы вывести тип? Просто увидев 'auto global_var;' (или даже 'extern auto global_var;'), компилятор не знает, какой тип переменной существует, особенно если это просто объявление с определением и инициализацией в другой единицы перевода. –

+0

Есть ли недостатки, которые перевешивают эти преимущества? Эти вещи разрешаются при соединении. Так что это зависит от компоновщика. Следовательно, компилятор не будет иметь понятия, как вывести 'auto'. – 101010

+1

@JoachimPileborg компилятор сможет вывести тип, потому что он явно указан в заголовке, а затем в исходном файле он уже знает, что это за тип. – Slava

ответ

1

Один из способов избежать необходимости запоминать имя типа global_var и добираться до нужного типа для компилятора - использовать decltype.

extern int global_var; 


... 


decltype(global_var) global_var; 

Единственный недостаток этого подхода заключается в том, что вы должны сделать объявление переменной доступным для компилятора до его определения.

Конечно, он работает и для static переменных-членов классов.

Просмотреть результаты работы http://ideone.com/W1WToV.

+0

Не думал об этом так, спасибо. Я действительно не вижу в этом недостатка, а скорее вверх. Единственный минус для этого метога IMHO, что он многословный, особенно для статических членов, но это можно сделать с помощью макроса. – Slava

+0

@Slava, макрос определенно сделает его менее повторяющимся и менее подверженным ошибкам. –

+0

Так что-то вроде '#define GLOBAL_VAR_DEF (x) decltype (x) x' then' GLOBAL_VAR_DEF (abc) = 123; ' – Slava

0

Вы можете использовать глобальный тип для вашего глобального:

using global_var_type = long; 
extern global_var_type global_var; 

А потом

global_var_type global_var; 

без необходимости повторной обработки, если вы измените тип (вам придется перекомпилировать конечно)

+0

Я думаю, что генерировать новый тип для каждой переменной немного слишком много (включая статические члены класса) – Slava

+0

Вы хотели, чтобы типы изменялись без повторного редактирования. Псевдонимы делают это за вас. Теперь я не понимаю, чего вы хотите. Компилятор, чтобы читать ваши мысли? –

+0

Типы, подлежащие изменению, не являются основной причиной, основной из которых - сделать программу менее подверженной ошибкам. – Slava

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