Symbol class_name::static_var marked as __import in file.OBJ was public

lev1972

В заголовочном файле описываю несколько класов, некоторые из них имеют статические члены_данные. этот заголовочный_файл включаю в некоторые файлы проекта содержащие тела функций. Статические члены надо где-то инициализировать, причем один только раз. делаю это в том файле в котором содержатся тела функций-членов этого класса. Все вроде правильно а линкер ругается, таким вот образом:
Error: Symbol class_name::static_var marked as __import in file.OBJ was public
Что это за хрень и зачем он это делает?
П/С: компилятор и линкер от Борланда 5.02

illegal

Стражи попробуй использовать.
#ifndef _BLABLA_
#define _BLABLA_
текст заголовочного файла, здесь же инициализируй статические переменные
#endif

lev1972

Пробовал.
во первых дефайны живут только в рамках файла, Т.Е. на соседние файлы проекта они не распостроняются, а во вторых если всеже извратится и директивами добится чтоб инициализация проходила в заголовочном файле, тогда вылетает таже ошибка ттолько file.obj это тот к которому заголовочный_файл относился на тот момент.

illegal

А в main или конструкторе класса не хочешь инициализировать?

FieryRush

Разве статические члены-данные не в h файле инициализировать нужно?

svistunov

>Разве статические члены-данные не в h файле инициализировать нужно?
Бы-га-га. Ещё претенденты в аццы есть, или опять будете Даркгрея ждать?

FieryRush

А у тебя мозгов нет самому в стандарте прочитать? Тогда просвещайся
The declaration of a static data member in its class definition is not
a definition and may be of an incomplete type other than cv-qualified
void. A definition shall be provided for the static data member in a
namespace scope enclosing the member's class definition. In the defi?
nition at namespace scope, the name of the static data member shall be
qualified by its class name using the :: operator. The initializer
expression in the definition of a static data member is in the scope
of its class (_basic.scope.class_
Написано в in a namespace scope enclosing the member's class definition и один раз. Это значит, что в h файле можно, но не обязательно.

Вам устное замечание. Личные оскорбления.

svistunov

Рад, что у тебя хватило сообразительности туда всё-таки заглянуть. Но кроме чтения, нужно ещё немного головой думать.
>Это значит, что в h файле можно, но не обязательно.
Значит, твоё предыдущее заявление было ошибочным, не так ли?
Но даже если не подходить формально, всё равно ты не прав.
Можно всю программу целиком в h-файл затолкать, и что?
Речь не о формализме, а о существе дела.
И чтобы это существо, наконец, уяснить, попробуй этот h-файл в две (или более) единицы трансляции включить.
PS Повторять ошибки Скорпа и спорить с тобой, что же ты на самом деле имел в виду, я не буду. Просто ты опять сказанул лажу.

illegal

>И чтобы это существо, наконец, уяснить, попробуй этот h-файл в две (или более) единицы трансляции включить.
Со стражами без проблем...

svistunov

>Со стражами без проблем...
Ха-ха-ха. Ну попробуй.
Чтобы потом не было разночтений, подчеркну ещё раз: имеется в виду h-файл, содержащий (в терминах стандарта) definition статического члена класса.

illegal

Не понял, в чем проблема-то?

electricbird

код?

svistunov

>Не понял, в чем проблема-то?
Уже попробовал?

illegal

Да нет, надеюсь что так расскажешь...

svistunov

Да напрягись чуток, создай проектик на 3 файла.
Мало ли, вдруг я неправ?

illegal

Ну дык прежде бы хотелось увидеть что ты по этому поводу думаешь...

svistunov

Думаю, что линкер тебя пошлёт на все четыре стороны

illegal

Напишика код инициализации статического члена класса, а то и в правду посылает...

svistunov

Слово "иниализация" в данном контексте неудачно. Мы говорим в первую очередь об определении.
int TestClass::testStaticMember;
double TestClass::anotherStaticMember = 1.0;

illegal

Ты прав, однако...

vln2

>>Значит, твоё предыдущее заявление было ошибочным, не так ли?
Я не делал никаких заявлений, если ты этого не заметил. Я задал вопрос.
Про херню с объявлениями в h файлах переменных я знаю, но это в данном случае выходит за рамки обсуждения.

ramses1971

> Написано в in a namespace scope enclosing the member's class definition и один раз.
Абсолютно верно.
> Это значит, что в h файле можно
Тоже верно, но только если этот h файл включается только в одном месте ( один раз ).
Тогда что такое, по-твоему, h файл? И чем он отличается от cpp файла ?

lev1972

как делу-то помоч?
Фиглишь компилятор метит их __import и чем это плохо? а самое главное как его заставить этого не делать?
П/С: на тривиальных классах чего-то этот глюк у меня повторить не получается.

antcatt77

static переменные лучше заворачивать в static-функции, тогда не надо думать где определять значение
т.е. из такого:


class Q
{
static int q;
};
int Q::q = 0;


лучше сделать:
class Q
{
static int& q
{
static int _q = 0;
return _q;
}
};

illegal

Объясни почему страж не работает. Ведь он же только в один файл включать определение должен.

svistunov

Твой любимый "страж" защищает от многократного (прямого или косвенного) включения данного заголовочного файла в любой другой файл.
В данной ситуации он совершенно ни при чём. Если для тебя это не очевидно, то надо начинать с изучения основ (про препроцессор что-нибудь почитай ).

lev1972

Ты меня спасаешь!

slo14

Это как-то уж слишком объектно...

illegal

Старуструп его не любит.

spiritmc

И правильно, кстати говоря, делает.
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Karel Capek

antcatt77

Ну, и хрен ли он тогда, не предложил никакой замены? за 15 лет можно было придумать схему перехода с h-файлов на нормальные модули.

spiritmc

Не пользуй Си.
И Си++ не пользуй.
Пиши на Аде, Модуле, Обероне, что-там-ещё-есть-такое-императивное-модульное...
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Karel Capek

svistunov

>Старуструп его не любит.
Это не та информация о препроцессоре, к обладанию которой нужно стремиться. Перечитай книжку ещё раз

antcatt77

так я уже полтора года и не юзаю... Хотя язык сам по себе нравился, но вот всякие наследия прошлого...

spiritmc

Хм.
Что пользуем?
---
"...Надо учиться --- не напрягаясь!.." Акад. А.А.Бучаченко.

antcatt77

C#. C++ тоже иногда используется, но в качестве низкоуровневого (по сравнению с c#) языка

spiritmc

А там появились модули?
---
...Я работаю антинаучным аферистом...

svistunov

>Что пользуем?
Уважаемый - самый большой апологет .NET среди всех мне известных людей
Впрочем, я ему по-хорошему завидую, потому что С++ (в коем, насколько я могу судить, он тоже весьма силён) гораздо сложнее, чем тот же C#, а платят дотнетчикам почему-то больше.

spiritmc

Из того, что язык сложнее, никак не следует, что он лучше.
Противоположное, кстати, тоже верно.
---
...Я работаю антинаучным аферистом...

tinka2302

Спорное утверждение.

spiritmc

Как, кстати, решается заявленная задача на "до-диезе"?
---
...Я работаю антинаучным аферистом...

electricbird

в которой части?

antcatt77

Да, модули есть. Зафиксены также еще многие проблемы C++ и Java. Из серьезного не хватает только восходящей типизации при полиморфизме.
зы
жду vs 2004 - там еще вкусностей добавят.

tinka2302

Насчет сложности. Насчет оплачиваемости я согласен

svistunov

>Из того, что язык сложнее, никак не следует, что он лучше.
Ну я на эту тему спорить и не собирался.

antcatt77



public class Q
{
public static int q = 0;
}


всё

spiritmc

В том числе и по оплачиваемости.
---
...Я работаю антинаучным аферистом...

electricbird

И где же написано, как определять "лучше"? Кому-то "лучше" всего и вовсе Хаскель

svistunov

>Насчет сложности.

electricbird

>жду vs 2004 - там еще вкусностей добавят.
ага, оставят один VB...

spiritmc

Разумно.
Как раз вписываются в идеологию исключения "static" из общей семантики.
---
...Я работаю антинаучным аферистом...

spiritmc

До него я когда-нибудь, возможно, доберусь.
Если сильно понадобится что-то придумать извращённое.
---
...Я работаю антинаучным аферистом...

antcatt77

> ага, оставят один VB...
для них - это будет невыгодно, не зря же они C++ довели до состояния полноценного .Net языка.
а фишки будут следующие:
generic, анонимные методы, итераторы и т.д.
ps
Будет как раз что на собеседовании спрашивать

resident


Простое правило, что в h файлах использовать только обьявления.
И проблем не будет.

antcatt77

Это правило "в h файлах использовать только обьявления" - нарушает более сильное правило:
"изменение кода должно быть атомарным"

illegal

Да уж перечитывал, эта мысль о препроцессоре в его книгах ключевая...

spiritmc

Тогда надо не извращаться с правкой заголовочных файлов,
а дёргать объявления внешней примочкой.
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Karel Capek

antcatt77

не совсем понял мысль...

spiritmc

Вот смотри.
У тебя есть прога из кучи файлов.
Видимость имён определяется при объявлении,
либо локальная (файл либо глобальная (прога).
(Локальные для функций не рассматриваем, они "самые локальные".)
Понятно, что имена глбольной области видимости определяются единожды,
и при определении требуют задания вида (типа и т.п.).
Тогда на кой чёрт, спрашивается, писать заголовочный файл,
если ты все эти объявления можешь надёргать из несущих смысловую нагрузку (а не просто "шумовых") файлов.
Особенно, учитывая то, что область видимости выделяется синтаксически
("static" для локальных имён).
Вообще, компилятор способен побить на единицы модульности (в Си --- функции и глобальные переменные или константы) сам.
Остаётся только необходимость объявления имён, описанных вне языка (напр., Си).
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Karel Capek

antcatt77

угу, согласен.
Современные языки (в том числе и C#) так себя и ведут.
непонятно, почему нельзя было похожий механизм добавить в C++
ps
хотя понятно, Страуструп очень боялся серьезных изменений, и всегда по максимуму старался, чтобы старый код продолжал компилироваться более новым компилятором.
Опыт Microsoft показывает - что он был не прав. Несовместимостей не надо боятся, и систему (в данном случае, язык) надо переодически оздоровливать - выкидывая устаревшие вещи.

spiritmc

Единственное, в чём они неправы, так это в том, что оставили Си-подобный синтаксис...
Всё равно, есть семантическая привязка к Си.
"Скобки любишь фигурные?" ; )
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Karel Capek

antcatt77

Зато переучиваться не надо, и путаницы меньше.
Когда поддерживаешь проект (или несколько) на разных языках, то тяжело вспоминать - а как же в этом языке скобочки выглядят.
ps
еще, ИМХО, скобочки лучше смотрятся, чем слова - нет загромождения кода не нужной информацией.
Информативность листинга повышается.

electricbird

#define begin {
#define end }

spiritmc

С этой точки зрения, лучше пусть будет язык без скобочек.
Наподобие Форта, Оккама...
---
...Я работаю антинаучным аферистом...

spiritmc

А препроцессор --- M.D.!
---
...Ибо нефиг...

spiritmc

Кстати, по поводу скобочек,
(CUP-OF-TEA-P)
---
"...Надо учиться --- не напрягаясь!.." Акад. А.А.Бучаченко.

antcatt77

Приведи, плиз, пример кода на Оккаме.
А как без скобок описываются классы, namespace-ы и т.д.?

antcatt77

Расшифруй, плиз.

resident

Да блин
просто нужно оформлять единицу трансляции как модуль в Дельфях
с заголовком модуля в виде h файла, и телом модуля в виде cpp файла со вставленным h файлом.
соответственно все инициализации переменных втолько в cpp файле.
А уж как побить cpp файл для всяких там атомарных изменений - это уже дело вторичное.

spiritmc

Э-э-э...
Тут движок, собака, пробелы поглощает...
В общем, далее "~" := " " (пробел).
/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\
-- occam
PROC write.string(CHAN output, VALUE string[])=
~~SEQ character.number = [1 FOR string[BYTE 0]]
~~~~output ! string[BYTE character.number]

write.string(terminal.screen, "Hello World!")
/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\
Из коллекции "Hello, world!"-ов.
Вроде того, "сделай это параллельно."
---
"...Надо учиться --- не напрягаясь!.." Акад. А.А.Бучаченко.

spiritmc

Я не успеваю находить исходные места цитат...
/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\
The Jargon Dictionary - http://info.astrian.net/jargon/How_Jargon_Works/Jargon_Construction/The_-P_convention.html
--------------------------------------------------------------------------------
The Jargon Dictionary : How Jargon Works : Jargon Construction : The `-P' convention
The `-P' convention
Turning a word into a question by appending the syllable `P'; from the LISP convention of appending the letter `P' to denote a predicate (a boolean-valued function). The question should expect a yes/no answer, though it needn't. (See T and NIL.)
At dinnertime:
Q: ``Foodp?''
A: ``Yeah, I'm pretty hungry.'' or ``T!''
At any time:
Q: ``State-of-the-world-P?''
A: (Straight) ``I'm about to go home.''
A: (Humorous) ``Yes, the world has a state.''
On the phone to Florida:
Q: ``State-p Florida?''
A: ``Been reading JARGON.TXT again, eh?''
[One of the best of these is a Gosperism. Once, when we were at a Chinese restaurant, Bill Gosper wanted to know whether someone would like to share with him a two-person-sized bowl of soup. His inquiry was: "Split-p soup?" -- GLS]
/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\/^\
---
...Я работаю антинаучным аферистом...

spiritmc

Нет, блин.
Надо оформлять единицу трансляции, как пакет в Аде.
; )
---
...Ибо нефиг...

resident

один хуй.
в обсчем как паскалеобразный модуль

spiritmc

Он не паскалеобразный! ; )
Он --- Modula-ный! : D
---
...Я работаю антинаучным аферистом...

antcatt77

А как, все-таки, через такой синтаксис будут оформляться определения классов, namespace-ов?
ps
>Тут движок, собака, пробелы поглощает...
юзай [ code] [ /code]

resident

вот зануда
я про оформление модулей
а не про язык.

antcatt77

почти понял

spiritmc



namespace space.1
class class.1
var var.1
var var.2
...
method m.1(...)
class class.2
var ...
method ...
proc proc.1 (...)
...
namespace space.2
namespace nested.name.space.1
...


---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Karel Capek

spiritmc

Забей, кому надо, уже поняли.
Это я так...
---
"...Надо учиться --- не напрягаясь!.." Акад. А.А.Бучаченко.

antcatt77

Если ориентироватся только на отступы, то при написании кода большим коллективом могут быть проблемы.
Так как у каждого человека, каждого текстового редактора, транслятора, неких вспомогательных тулзов - могут быть свои представления:
1. какой размер отступа
2. отступ - это пробелы или таб
3. скольки пробелам равен таб.
зы
method m.1(...)
тем более я вижу, что у методов все равно появляются скобки.

resident

кстати по поводу форматирования
в случаях коллективной разработки помогают утилиты, которые переформатируют сорсы под любой "вкус и цвет"
для С++ есть,например, SourceStyler.
В обсчем проблема сводится в поимении( создании ) утилитки.

Niklz

а какие проблемы Jav'ы решены в С# ? и как?

spiritmc

Насколько я помню, там пробелы.
Операторные скобки отличабтся от функциональных.
Тогда надо пользовать Форт, дабы не было скобок вообще.
---
...Я работаю антинаучным аферистом...

spiritmc

Угу.
А утилитка зовётся Emacs?
Только кому это надо?..
---
...Я работаю антинаучным аферистом...

electricbird

>Только кому это надо?..
ключевая мысль этого треда...

spiritmc

Я не вижу необходимости переформатировать код,
если только он не "obfuscated".
---
...Я работаю антинаучным аферистом...

antcatt77

Одна из основных проблем Java в том, что ее "песочница" закрыта -> усложняется стыковка с уже написанными программами, библиотеками -> одна из основных причин, почему Java так и не прижилась на клиенте.
В .Net-е - песочника открыта, что особенно видно на примере Managed C++, где легко можно совмещать, как "песочный" код, так и обычный.
В плюс к .Net-у идет и то, что платформу не стали завязывать на один язык.
свойства
box-инг (прозрачное преобразование примитивных типов в объект и обратно)
не надо прописывать выбрасываемые исключения в определение класса.
зы
sun очень плохо развивает java как язык, основной упор делается на развитие Java-ы как платформы.
зы
сравнивать детально C# и Java-у мне сложно, т.к. я хорошо знаком только с первыми версиями Java-ы, а текущее состояние Java-ы знаю поверхностно.

antcatt77

Добавился новый уровень namespace - код придется "переформатировать",
часть кода, например, генерируется двухсторонней тулзой - опять переформатирование.

spiritmc

M-x indent-block, кажется...
Опять же, наверняка есть готовые редакторы либо режим под Емакс.
---
...Я работаю...

Niklz

Одна из основных проблем Java в том, что ее "песочница" закрыта -> усложняется стыковка с уже написанными программами, библиотеками -> одна из основных причин, почему Java так и не прижилась на клиенте.

стыковка не особенно сложна. есть интерфейс JNI , который дает доступ коду на любом языке к данным и методам java-классов и позволяет java коду вызывать функции скомпилированные с другого языка. закрытость песочнице - следствие стремления sun к безопасности(в отличие от микрософт : )
одна из основных причин того что java на клиенте мало используется, то, что для этого у каждого пользователя на компе должна быть новая версия среды выполнения java-кода. сложно представить, как сделать, чтобы у всех пользователей была эта среда. в случае с микрософт, я думаю среда выполнения - часть Windows. достоинства монополизма налицо.
В .Net-е - песочника открыта, что особенно видно на примере Managed C++, где легко можно совмещать, как "песочный" код, так и обычный.
не знаю честно говоря как у них песочница реализована
В плюс к .Net-у идет и то, что платформу не стали завязывать на один язык.

да. тут согласен.
box-инг (прозрачное преобразование примитивных типов в объект и обратно)

да, в jave приходится явно преобразовывать. но это не слишком частая ситуация и не самое большое неудобство javы
не надо прописывать выбрасываемые исключения в определение класса.

и в javе не надо. там выбрасываемые методом исключения прописывааются в определение метода. и это имхо очень правильно.
sun очень плохо развивает java как язык, основной упор делается на развитие Java-ы как платформы.

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

если говорить о языке, то синтаксически он почти не изменился.

antcatt77

> и в javе не надо. там выбрасываемые методом исключения прописывааются в определение метода. и это имхо очень правильно.
Да, я это и имел ввиду.
Это не правильно.
Потому что допустим, у нас есть два класса User и Data.
User вызывает некие методы у Data - все зашибись, у нас все хорошо у Data никак исключений нет, мы так и написала и в User-е и Data-е.
Завтра мы хотим вынести Data на удаленный комп, между User-ом и Data-ой вставляется прозрачная proxy.
Внимание вопрос, в определения каких классов, должны вносится перехват исключений которые инициирует proxy (например, сеть отвалилась). И какое отношение сетевые исключения имеют к бизнес-классу User, если их там прописать.

Niklz

совершенно прозрачный прокси это плохо. это значит, что ты перекладываешь всю работу по проведению вызова на операционку+компилятор - в итоге все будет работать только в одной конкретной операционке и зависеть от ее произвола.
в RMI/CORBA/EJB вызовы удаленных объектов производятся с помощью интерфейсов или оберток вызываемого класса лежащих на вызывающей стороне. обработку исключений вызова производит клиентская обертка вызываемого класса и вызывающий класс. вызывающий класс так или иначе должен знать что метод не удалось вызвать. так что проблема немного надуманная : ) есть технологии и они неплохо работают. как кстати этот самый вызов удаленных объектов в C# реализован? и где там прописываются исключения выбрасываемые методом?

antcatt77

Прозрачный прокси - имелось ввиду на прикладном уровне, т.е. некий класс ProxyData, который умеет выглядеть как Data, но за данными обращается на сервер

antcatt77

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

Niklz

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

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

antcatt77

Так самый главный вопрос: если метод абстрактный, то какой список выбрасываемых исключений ему прописать?

spiritmc

Правильно: M-x indent-region
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Karel Capek

spiritmc

Кстати, это уже есть.
"Всё украдено до нас!"
Например, http://www.programmersheaven.com/zone3/cat479/
А значит, есть и более качественно сделанное.
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Karel Capek
Оставить комментарий
Имя или ник:
Комментарий: