|
|
|
странная ошибка с консантной строкой
|
|||
|---|---|---|---|
|
#18+
Скажите, пожалуйста, в чём ошибка? В заголовочном файле объявляю константу #ifndef __DB_CONSTS_H #define __DB_CONSTS_H const char* LIST_ARC_TI_VIEW = "ListArcData"; #endif Затем в двух файлах .cpp подключаю данный заголовочный файл. При использовании в обех файлах строковой константы выдаётся ошибка. Error 1 error LNK2005: "char const * const LIST_ARC_TI_VIEW" (?LIST_ARC_TI_VIEW@@3PBDB) already defined in ArchiverThreads.obj TelemechanicServer.obj ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2007, 12:00 |
|
||
|
странная ошибка с консантной строкой
|
|||
|---|---|---|---|
|
#18+
Нипиши эту строчку в файла .cpp, а здесь сделай extern перед ней. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2007, 12:15 |
|
||
|
странная ошибка с консантной строкой
|
|||
|---|---|---|---|
|
#18+
Господи! Она у тебя дважды определена. В каждом из .o есть отведено место под эту пременную. Надо вот так в .h extern const char* LIST_ARC_TI_VIEW; и только в одном cpp const char* LIST_ARC_TI_VIEW = "ListArcData"; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2007, 12:19 |
|
||
|
странная ошибка с консантной строкой
|
|||
|---|---|---|---|
|
#18+
Я понимаю? В одном из .cpp проекта const char* LIST_ARC_TI_VIEW = "ListArcData"; А в h-файле: extern const char* LIST_ARC_TI_VIEW; Не совсем понятно, почему в моеём случае определение происходит дважды. Не могли бы вы пояснить подробнее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2007, 14:16 |
|
||
|
странная ошибка с консантной строкой
|
|||
|---|---|---|---|
|
#18+
OLEG_2005Я понимаю? В одном из .cpp проекта const char* LIST_ARC_TI_VIEW = "ListArcData"; А в h-файле: extern const char* LIST_ARC_TI_VIEW; Не совсем понятно, почему в моеём случае определение происходит дважды. Не могли бы вы пояснить подробнее? Определение: const char* LIST_ARC_TI_VIEW = "ListArcData"; Объявление: extern const char* LIST_ARC_TI_VIEW; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2007, 14:22 |
|
||
|
странная ошибка с консантной строкой
|
|||
|---|---|---|---|
|
#18+
OLEG_2005Я понимаю? В одном из .cpp проекта const char* LIST_ARC_TI_VIEW = "ListArcData"; А в h-файле: extern const char* LIST_ARC_TI_VIEW; Не совсем понятно, почему в моеём случае определение происходит дважды. Не могли бы вы пояснить подробнее? А что тут не понятного? В каждом cpp, который прямо или косвенно (транзитивно) включает в себя h появляется строчка const char* LIST_ARC_TI_VIEW = "ListArcData"; ну и соотвественно компилятор в каждом из .o отводит место под соотв переменную, а когда редактор связей начинает работать он шизеет от множества таких переменных. Когда же ты пишешь в некотором модуле extern ... то компилятор только заносит ее в таблицу символов, но места под нее не отводится. А потом приходит редактор связей и пытается связать это имя с физическим расположением переменной в памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2007, 14:29 |
|
||
|
странная ошибка с консантной строкой
|
|||
|---|---|---|---|
|
#18+
Спасибо, понял. Затормозил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2007, 14:39 |
|
||
|
странная ошибка с консантной строкой
|
|||
|---|---|---|---|
|
#18+
OLEG_2005 пишет: > Скажите, пожалуйста, в чём ошибка? > В заголовочном файле объявляю константу > > #ifndef __DB_CONSTS_H > #define __DB_CONSTS_H > > const char* LIST_ARC_TI_VIEW = "ListArcData"; > > #endif > > Затем в двух файлах .cpp подключаю данный заголовочный файл. > При использовании в обех файлах строковой константы выдаётся ошибка. Должно быть так: static const char* LIST_ARC_TI_VIEW = "ListArcData"; Модификатор const в C++ объявляет, как ни странно, не константу, а немодифицируемую переменную. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2007, 20:43 |
|
||
|
странная ошибка с консантной строкой
|
|||
|---|---|---|---|
|
#18+
MasterZivДолжно быть так: static const char* LIST_ARC_TI_VIEW = "ListArcData"; Модификатор const в C++ объявляет, как ни странно, не константу, а немодифицируемую переменную.Ага, а static будет конфликтовать с extern :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2007, 20:53 |
|
||
|
странная ошибка с консантной строкой
|
|||
|---|---|---|---|
|
#18+
Akh пишет: > Нипиши эту строчку в файла .cpp, а здесь сделай extern перед ней. Я думаю все же автору вопроса нужна константа, а не переменная. Тогда не extern а static. еще раз. Модификатор const говорит только одно - что в своей области видимости, после инициализации, переменная нигде не будет изменена (компилятор гарантирует это). Два модификатора static const разрешают также компилятору НЕ выделять под переменную место в статической памяти, а подставлять вместо переменной напрямую ее значение, записанное в статическом инициализаторе. (правда я не помню что там в стандарте по этому поводу, надо глянуть). Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2007, 20:54 |
|
||
|
странная ошибка с консантной строкой
|
|||
|---|---|---|---|
|
#18+
Эка ты хватил, MasterZiv. А теперь посмотрим на все это с другой стороны, со стороны комплятора. Возможны три случая: 1) в гловальном скоупе, как у нас. Ну встретил наш компилятор такую вот константу, ежели она использована в выражении которое не может бытьвычислено во время компиляции, ему остается только отвести под нее место в модуле и использовать как статическуую, хоть и константную, переменную. И так получаем в каждом модуле своя собственная переменная. Наше решенее предпочтительнее. 2) Внутри функции объявить static const. Ну имеет смысл, сэкономим на повторных инициализациях 3) внутри класса. А вот тут нас поджидает засада. static const внутри класса, вроде как только интегральным типом может быть, да и место под нее отвести все же придется. И вообще лучше и не пользоваться, во всяком случае у Страуструппа про это как-то мутно написано... Ну собственно нас то интересовал случай № 1, а посему вы не правы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2007, 09:28 |
|
||
|
странная ошибка с консантной строкой
|
|||
|---|---|---|---|
|
#18+
blinded пишет: > 1) в гловальном скоупе, как у нас. Ну встретил наш компилятор такую вот > константу, ежели она использована в выражении которое не может > бытьвычислено во время компиляции, ему остается только отвести под нее > место в модуле и использовать как статическуую, хоть и константную, > переменную. И так получаем в каждом модуле своя собственная переменная. > Наше решенее предпочтительнее. > 2) Внутри функции объявить static const. Ну имеет смысл, сэкономим на > повторных инициализациях > 3) внутри класса. А вот тут нас поджидает засада. static const внутри > класса, вроде как только интегральным типом может быть, да и место под > нее отвести все же придется. И вообще лучше и не пользоваться, во всяком > случае у Страуструппа про это как-то мутно написано... > > Ну собственно нас то интересовал случай № 1, а посему вы не правы Это ты не прав, родной. Еще есть статические переменные модуля. Их-то и надо определять, чтобы объявить константу. Можно конечно их и в классе, и в функции объявлять, никто не запрещает. Но классический случай объявления константы именно такой - в global scope пишем statiс const SomeType = static-initializer; Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2007, 15:08 |
|
||
|
странная ошибка с консантной строкой
|
|||
|---|---|---|---|
|
#18+
А я тебе про это и написал в п 1. Только вот у человека 2 модуля и соответственно в каждом будет по копии. а ежели не 2, а 100. А на счет классичности объявления - надо быть современнее и писать namespace { const SomeType ... } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2007, 15:33 |
|
||
|
странная ошибка с консантной строкой
|
|||
|---|---|---|---|
|
#18+
blinded пишет: > А я тебе про это и написал в п 1. Только вот у человека 2 модуля и > соответственно в каждом будет по копии. а ежели не 2, а 100. Ты дятел, ты про STATIC почитай что нибудь, потом посмотрим, сколько копий насчитаешь. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2007, 17:46 |
|
||
|
странная ошибка с консантной строкой
|
|||
|---|---|---|---|
|
#18+
MasterZiv blinded пишет: > А я тебе про это и написал в п 1. Только вот у человека 2 модуля и > соответственно в каждом будет по копии. а ежели не 2, а 100. Ты дятел, ты про STATIC почитай что нибудь, потом посмотрим, сколько копий насчитаешь. Posted via ActualForum NNTP Server 1.4 Ok! Сколько в программе переменных my_name_is f.cpp Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2007, 18:17 |
|
||
|
странная ошибка с консантной строкой
|
|||
|---|---|---|---|
|
#18+
blindedOk! Сколько в программе переменных my_name_isНу это не интересно. Вот так будет намного интересней: f.cpp Код: plaintext 1. 2. 3. 4. 5. Код: plaintext 1. 2. 3. 4. 5. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2007, 18:29 |
|
||
|
странная ошибка с консантной строкой
|
|||
|---|---|---|---|
|
#18+
MasterZivТы дятел, ты про STATIC почитай что нибудь, потом посмотрим, сколько копий насчитаешь.Читай не читай, а смыслов у static'а как было два, так и осталось :) Либо превращение стековой переменной в постоянную с областью видимости внутри функции, либо ограничение видомости глобальной перменной только модулем в котором сделано объявление. Использовать static const для объявления глобальных констант все равно не получится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2007, 18:34 |
|
||
|
странная ошибка с консантной строкой
|
|||
|---|---|---|---|
|
#18+
интересно, под каким компайлером дело происходит? Б.Страуструп, ЯП C++ 3изд., 9.2. Компоновка По умолчанию const и typedef подразумевают внутренннюю компоновку. [...] Можно заставить константу компоноваться внешним образом путем ее явного объявления: //file1: extern const int a = 77; //file2: extern const int a; void g() { cout << a << '\n'; } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2007, 18:56 |
|
||
|
странная ошибка с консантной строкой
|
|||
|---|---|---|---|
|
#18+
White Owl пишет: > Использовать static const для объявления глобальных констант все равно > не получится. Да блин, ну как не получится, если это штатный способ делать это. Ну да, ну не будут они глобальными, ну и что? Они ж константы. А память под них компилятор все равно может не отводить. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2007, 18:58 |
|
||
|
странная ошибка с консантной строкой
|
|||
|---|---|---|---|
|
#18+
MasterZiv White OwlИспользовать static const для объявления глобальных констант все равно не получится. Да блин, ну как не получится, если это штатный способ делать это. Ну да, ну не будут они глобальными, ну и что? Они ж константы. А память под них компилятор все равно может не отводить.Я тоже хочу такую траву.... Ты сам то читаешь что ты пишешь? Или ты просто пофлеймить решил? И вообще, если б это был штатный способ, то он бы хотя бы работал. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2007, 19:11 |
|
||
|
странная ошибка с консантной строкой
|
|||
|---|---|---|---|
|
#18+
White Owl пишет: > И вообще, если б это был штатный способ, то он бы хотя бы работал. :) Что не работает ? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2007, 19:13 |
|
||
|
странная ошибка с консантной строкой
|
|||
|---|---|---|---|
|
#18+
MasterZiv White Owl пишет: > И вообще, если б это был штатный способ, то он бы хотя бы работал. :) Что не работает ?Неа... не работает почему-то... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2007, 19:15 |
|
||
|
странная ошибка с консантной строкой
|
|||
|---|---|---|---|
|
#18+
Вообще, вот что пишут в стандарте. 3.5 [also 7.1.5] A name of file scope that is explicitly declared const, and not explicitly declared extern, has internal linkage, while in C it would have external linkage. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2007, 20:57 |
|
||
|
странная ошибка с консантной строкой
|
|||
|---|---|---|---|
|
#18+
MasterZiv Вообще, вот что пишут в стандарте. 3.5 [also 7.1.5] A name of file scope that is explicitly declared const, and not explicitly declared extern, has internal linkage, while in C it would have external linkage.Угу. А static ты как сюда сумел приплести? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2007, 21:15 |
|
||
|
странная ошибка с консантной строкой
|
|||
|---|---|---|---|
|
#18+
White Owl пишет: > Что не работает ? > Неа... не работает почему-то... Там не было запятой. Что именно не работает ? Как не работает ? В чем проявляется неработоспособность кода ? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2007, 21:16 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34450818&tid=2029068]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
17ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 244ms |
| total: | 330ms |

| 0 / 0 |
