есть 2 cpp файла. Нужно объявить глобальную пременную, чтобы ее можно было видеть из всех спп файлов Вопрос - как?
Очень извиняюсь. Перечитал 2 раза Так и не понял, где там рассказывается, как объявить глобальную в одном спп-файле, чтобы ее можно было использовать в другом.
intel_x128 в простейшем случае, например так: Code (Text): // a.cpp int a; Code (Text): // b.cpp extert int a; Однако чаще делают не так, а вот как: Code (Text): // a.h #pragma once extern int a; // здесь объявление Code (Text): // a.cpp #include "a.h" int a; // здесь определение Code (Text): #include "a.h" void f() { a = 1; // здесь используем } Так строже и безопаснее для разработчика. Кстати, глобальные переменные, тем более с внешним связыванием - это вообще-то дурной тон в большинстве случаев. Особенно в цепепе.
наверное идентификатор ставят extern "C" токо то если сразу с двух проектов и в C и в C++ а у него в рамках одного
r90 cppasm В Си глобальные переменные по умолчанию имеют внутреннее связывание. В си-плюсплюс - наоборот, внешнее. И то и другое, разумеется, если квалификатор не задан явно. Хотя в Си я особо не силен, возможно в C99 уже по-другому, но в стандарте K&R именно так. Поэтому в Си приведенный пример работать не будет, надо явно дописывать extern.
Это у меня с памятью проблемы? Мне что-то кажется, что из твоего примера на K&R не отработает лишь одна строчка -- это не подпадающий ни под какой из стандартов #pragma once. То что это отработало бы в любом из компиляторов C с которыми я сталкивался -- это точно абсолютно. На работе буду, загляну в K&R. У меня нету дома. Но я не думаю, что там иначе.
'#pragma once' - вполне законная директива препроцессора (16.6/1). Все что находится после '#pragma' трактуется как 'implementation-defined', и в принципе для разных компиляторов это может означать разные вещи. Хотя гарантируется, что если компилятор не распознал оставшуюся часть ('once'), то она будет проигнорирована.
Нет. Даже в С89 связывание у них внешнее. Для внутреннего надо static добавить. Твой пример - это и есть Си, если не считать что в комментариях имя модуля написано a.cpp Это всего лишь говорит компилятору не манглить имена.
cppasm это неверно. возмем две единицы трансляции A и B A.cpp int x; B.cpp int x; переменные действительно имеют внешнее связывание и в данном случае будет нарушено ODR. поэтому в одной из единиц нужно будет написать так extern int x;
cppasm Ну, это легко проверить... Второй пример будет работать всегда, потому что там extern задается явно. А вот первый в си работать вроде как не должен. Еще раз ИМХО, т.к. си я знаю значительно хуже плюс-плюса.
Ustus По-моему первый вариант не будет работать и в C++, ибо нет ключевого слова extert. Но если его поменять на extern, то первый вариант как раз описан в моей нубской книжке по Си.
И кстати первый вариант по-моему лучше, так как не захламляет пространство имён везде где включён заголовочный файл.