LINUX.ORG.RU
Ответ на: комментарий от ktan

Ну а почему раньше нельзя было?

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от i-rinat

А у меня неможно:

Editor.h:215:14: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11
bool isInit=false;

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

Xintrea ★★★★★
() автор топика

Но зачем? Всегда воспринимал инициализацию переменной == её определению. Хедер может быть включен в несколько файлов — и как разруливать множественные определения?

alegz ★★★★
()

В заголовочных файлах надо писать так:

extern TypefaceFormatter *typefaceFormatter;

Deleted
()

Если речь про глобальные переменные, то можно, правда лучше это делать в cpp-файле, иначе при включении заголовка в несколько файлов возникнет проблема. Если речь о членах класса, то такое можно делать только начиная с C++11.

m0rph ★★★★★
()

Моно, но категорически не рекомендуется, потому что с родни раскладыванию граблей. А потом ты на них начнешь наступать и придется сделать нормально: в header: extern type varname;, а в соответствующий .cpp type varname = val;

А еще рекомендую задуматься, почему у тебя берутся глобальные переменные в хеадере ни к чему не относящиеся. Может стоит задуматься о singleton'е, например?

invy ★★★★★
()
Ответ на: комментарий от i-rinat

А, поле класса? Тогда указатели тоже нельзя.

Да, речь идет о полях класса. С указателями инициализация в NULL прокатывает.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Да ненадо тут вот этой мистики:

class Test {
    int *ptr = NULL;
};
 
int main() {
	Test t;
	return 0;
}

Все *не*работает (как и положено):

prog.cpp:5: error: ISO C++ forbids initialization of member 'ptr'
prog.cpp:5: error: making 'ptr' static
prog.cpp:5: error: invalid in-class initialization of static data member of non-integral type 'int*'

http://ideone.com/BZSSS9

Правда лениво в стандарт сейчас лезть..

KennyMinigun ★★★★★
()
Ответ на: комментарий от Xintrea

Потому что для этого есть конструктор и список инициализации.

И да, use nullptr, Luke!

И, да, ничего инициализировать нельзя. Если у тебя можно, то похоже на баг. Указатель ничем не отличается от других типов.

invy ★★★★★
()
Последнее исправление: invy (всего исправлений: 1)
Ответ на: комментарий от Xintrea

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

потому что С (и ++ с ним) недоязыки, в которых .h это не декларативно-интерфейсная часть, как многим кажется. Это всего-то кусок того-же .c файла тупо вставляемого препроцессором во все встречно-поперечные где есть соответсвующий include.

А что должен сделать компилятор после того как препроцессор ему подсунул int foo=bar ? правильно - он должен разметать находку по соответсвующим секциям в объектнике. А что должен сделать линкер встретивший два одноимённых «foo» в одинаковых секциях разных объектников? хороший линкер должен был-бы послать плохового программиста ;-)

почему до 2011 года это было неможно для переменных обычных типов, и можно для указателей

видимо от того что указатель не является обычной константой (это типа ссылка на объект) - он разрешается полностью при линковке/ дин.загрузке и не требует доп.записи. Если в .h поставить void *p=(void*)0x66ffaa; то gcc должен ругнуться на константу (если не включен флаг merge-const или как он там называется). Хотя он по всякому должен ругаться на redeclaration

так что .h для переменных - только «extern» :-)

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

видимо от того что указатель не является обычной константой (это типа ссылка на объект) - он разрешается полностью при линковке/ дин.загрузке и не требует доп.записи.

Какая же каша в голове должна быть, чтобы написать такое :-(

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