powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / странная ошибка с консантной строкой
25 сообщений из 37, страница 1 из 2
странная ошибка с консантной строкой
    #34446903
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скажите, пожалуйста, в чём ошибка?
В заголовочном файле объявляю константу

#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
...
Рейтинг: 0 / 0
странная ошибка с консантной строкой
    #34446959
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нипиши эту строчку в файла .cpp, а здесь сделай extern перед ней.
...
Рейтинг: 0 / 0
странная ошибка с консантной строкой
    #34446979
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господи! Она у тебя дважды определена. В каждом из .o есть отведено место под эту пременную.
Надо вот так
в .h
extern const char* LIST_ARC_TI_VIEW;
и только в одном cpp
const char* LIST_ARC_TI_VIEW = "ListArcData";
...
Рейтинг: 0 / 0
странная ошибка с консантной строкой
    #34447395
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я понимаю? В одном из .cpp проекта
const char* LIST_ARC_TI_VIEW = "ListArcData";

А в h-файле:
extern const char* LIST_ARC_TI_VIEW;

Не совсем понятно, почему в моеём случае определение происходит дважды. Не могли бы вы пояснить подробнее?
...
Рейтинг: 0 / 0
странная ошибка с консантной строкой
    #34447411
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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;
...
Рейтинг: 0 / 0
странная ошибка с консантной строкой
    #34447426
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 ... то компилятор только заносит ее в таблицу символов, но места под нее не отводится. А потом приходит редактор связей и пытается связать это имя с физическим расположением переменной в памяти.
...
Рейтинг: 0 / 0
странная ошибка с консантной строкой
    #34447460
OLEG_2005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, понял. Затормозил.
...
Рейтинг: 0 / 0
странная ошибка с консантной строкой
    #34448513
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
странная ошибка с консантной строкой
    #34448523
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivДолжно быть так:
static const char* LIST_ARC_TI_VIEW = "ListArcData";

Модификатор const в C++ объявляет, как ни странно, не константу,
а немодифицируемую переменную.Ага, а static будет конфликтовать с extern :)
...
Рейтинг: 0 / 0
странная ошибка с консантной строкой
    #34448526
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh пишет:

> Нипиши эту строчку в файла .cpp, а здесь сделай extern перед ней.

Я думаю все же автору вопроса нужна константа, а не переменная.
Тогда не extern а static.

еще раз.

Модификатор const говорит только одно - что в своей области
видимости, после инициализации, переменная нигде не будет изменена
(компилятор гарантирует это).

Два модификатора static const разрешают также компилятору
НЕ выделять под переменную место в статической памяти, а подставлять
вместо переменной напрямую ее значение, записанное в статическом
инициализаторе.

(правда я не помню что там в стандарте по этому поводу, надо глянуть).
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
странная ошибка с консантной строкой
    #34448948
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эка ты хватил, MasterZiv. А теперь посмотрим на все это с другой стороны, со стороны комплятора.
Возможны три случая:
1) в гловальном скоупе, как у нас. Ну встретил наш компилятор такую вот константу, ежели она использована в выражении которое не может бытьвычислено во время компиляции, ему остается только отвести под нее место в модуле и использовать как статическуую, хоть и константную, переменную. И так получаем в каждом модуле своя собственная переменная. Наше решенее предпочтительнее.
2) Внутри функции объявить static const. Ну имеет смысл, сэкономим на повторных инициализациях
3) внутри класса. А вот тут нас поджидает засада. static const внутри класса, вроде как только интегральным типом может быть, да и место под нее отвести все же придется. И вообще лучше и не пользоваться, во всяком случае у Страуструппа про это как-то мутно написано...

Ну собственно нас то интересовал случай № 1, а посему вы не правы
...
Рейтинг: 0 / 0
странная ошибка с консантной строкой
    #34450238
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blinded пишет:

> 1) в гловальном скоупе, как у нас. Ну встретил наш компилятор такую вот
> константу, ежели она использована в выражении которое не может
> бытьвычислено во время компиляции, ему остается только отвести под нее
> место в модуле и использовать как статическуую, хоть и константную,
> переменную. И так получаем в каждом модуле своя собственная переменная.
> Наше решенее предпочтительнее.
> 2) Внутри функции объявить static const. Ну имеет смысл, сэкономим на
> повторных инициализациях
> 3) внутри класса. А вот тут нас поджидает засада. static const внутри
> класса, вроде как только интегральным типом может быть, да и место под
> нее отвести все же придется. И вообще лучше и не пользоваться, во всяком
> случае у Страуструппа про это как-то мутно написано...
>
> Ну собственно нас то интересовал случай № 1, а посему вы не правы

Это ты не прав, родной.

Еще есть статические переменные модуля. Их-то и надо определять,
чтобы объявить константу. Можно конечно их и в классе, и в функции
объявлять, никто не запрещает. Но классический случай объявления
константы именно такой -

в global scope пишем
statiс const SomeType = static-initializer;

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
странная ошибка с консантной строкой
    #34450337
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я тебе про это и написал в п 1. Только вот у человека 2 модуля и соответственно в каждом будет по копии. а ежели не 2, а 100.
А на счет классичности объявления - надо быть современнее и писать
namespace
{
const SomeType ...
}
...
Рейтинг: 0 / 0
странная ошибка с консантной строкой
    #34450818
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blinded пишет:
> А я тебе про это и написал в п 1. Только вот у человека 2 модуля и
> соответственно в каждом будет по копии. а ежели не 2, а 100.

Ты дятел, ты про STATIC почитай что нибудь, потом посмотрим, сколько
копий насчитаешь.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
странная ошибка с консантной строкой
    #34450926
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
static const char* my_name_is = "woody";
void f()
{
}
g.cpp
Код: plaintext
1.
2.
3.
4.
static const char* my_name_is = "woody";
void g()
{
}
main.cpp
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
extern f();
extern g();
int main()
{
  f();
  g();
}
...
Рейтинг: 0 / 0
странная ошибка с консантной строкой
    #34450960
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedOk! Сколько в программе переменных my_name_isНу это не интересно. Вот так будет намного интересней:

f.cpp
Код: plaintext
1.
2.
3.
4.
5.
static const char* my_name_is = "woody";
void f()
{
   cout << my_name_is;
}
g.cpp
Код: plaintext
1.
2.
3.
4.
5.
static const char* my_name_is = "pecker";
void g()
{
   cout << my_name_is;
}
main.cpp
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
static const char* my_name_is = "someone else";
extern f();
extern g();
int main()
{
  f();
  g();
  cout << my_name_is;
}
...
Рейтинг: 0 / 0
странная ошибка с консантной строкой
    #34450976
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivТы дятел, ты про STATIC почитай что нибудь, потом посмотрим, сколько
копий насчитаешь.Читай не читай, а смыслов у static'а как было два, так и осталось :) Либо превращение стековой переменной в постоянную с областью видимости внутри функции, либо ограничение видомости глобальной перменной только модулем в котором сделано объявление.
Использовать static const для объявления глобальных констант все равно не получится.
...
Рейтинг: 0 / 0
странная ошибка с консантной строкой
    #34451038
интересно, под каким компайлером дело происходит?

Б.Страуструп, ЯП C++ 3изд., 9.2. Компоновка
По умолчанию const и typedef подразумевают внутренннюю компоновку. [...]
Можно заставить константу компоноваться внешним образом путем ее явного объявления:

//file1:

extern const int a = 77;

//file2:

extern const int a;

void g()
{
cout << a << '\n';
}
...
Рейтинг: 0 / 0
странная ошибка с консантной строкой
    #34451043
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl пишет:

> Использовать static const для объявления глобальных констант все равно
> не получится.

Да блин, ну как не получится, если это штатный способ делать это.
Ну да, ну не будут они глобальными, ну и что? Они ж константы.
А память под них компилятор все равно может не отводить.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
странная ошибка с консантной строкой
    #34451068
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv White OwlИспользовать static const для объявления глобальных констант все равно не получится.

Да блин, ну как не получится, если это штатный способ делать это.
Ну да, ну не будут они глобальными, ну и что? Они ж константы.
А память под них компилятор все равно может не отводить.Я тоже хочу такую траву.... Ты сам то читаешь что ты пишешь? Или ты просто пофлеймить решил?
И вообще, если б это был штатный способ, то он бы хотя бы работал. :)
...
Рейтинг: 0 / 0
странная ошибка с консантной строкой
    #34451072
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl пишет:

> И вообще, если б это был штатный способ, то он бы хотя бы работал. :)

Что не работает ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
странная ошибка с консантной строкой
    #34451075
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
White Owl пишет:
> И вообще, если б это был штатный способ, то он бы хотя бы работал. :)
Что не работает ?Неа... не работает почему-то...
...
Рейтинг: 0 / 0
странная ошибка с консантной строкой
    #34451182
Фотография 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.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
странная ошибка с консантной строкой
    #34451196
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 ты как сюда сумел приплести?
...
Рейтинг: 0 / 0
странная ошибка с консантной строкой
    #34451199
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl пишет:

> Что не работает ?
> Неа... не работает почему-то...

Там не было запятой. Что именно не работает ?
Как не работает ? В чем проявляется неработоспособность кода ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
25 сообщений из 37, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / странная ошибка с консантной строкой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]