2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 const char[] в Си
Сообщение29.02.2012, 19:52 
Заслуженный участник


09/09/10
3729
Чего-то я туплю... а может, я вовсе пытаюсь сделать глупую вещь?

Файл utils.h:
Используется синтаксис C
const char COMM_SEND[] = "SEND ";
const char COMM_LIST[] = "LIST";
const char COMM_GETM[] = "GETM";
const char COMM_QUIT[] = "QUIT";


В utils.c они используются и... и при линковке сыпятся сообщений о двойных определениях:

obj\Debug\utils.o:utils.c:(.rdata+0x0): multiple definition of `COMM_SEND'
obj\Debug\userlist.o:userlist.c:(.rdata+0x0): first defined here
obj\Debug\utils.o:utils.c:(.rdata+0x6): multiple definition of `COMM_LIST'
obj\Debug\userlist.o:userlist.c:(.rdata+0x6): first defined here
obj\Debug\utils.o:utils.c:(.rdata+0xb): multiple definition of `COMM_GETM'
obj\Debug\userlist.o:userlist.c:(.rdata+0xb): first defined here
obj\Debug\utils.o:utils.c:(.rdata+0x10): multiple definition of `COMM_QUIT'
obj\Debug\userlist.o:userlist.c:(.rdata+0x10): first defined here
obj\Debug\main.o:main.c:(.rdata+0x0): multiple definition of `COMM_SEND'
obj\Debug\userlist.o:userlist.c:(.rdata+0x0): first defined here
obj\Debug\main.o:main.c:(.rdata+0x6): multiple definition of `COMM_LIST'
obj\Debug\userlist.o:userlist.c:(.rdata+0x6): first defined here
obj\Debug\main.o:main.c:(.rdata+0xb): multiple definition of `COMM_GETM'
obj\Debug\userlist.o:userlist.c:(.rdata+0xb): first defined here
obj\Debug\main.o:main.c:(.rdata+0x10): multiple definition of `COMM_QUIT'
obj\Debug\userlist.o:userlist.c:(.rdata+0x10): first defined here


Я так понимаю, беда в том, что userlist.c тоже подключает utils.h (но ему без этого никак), поэтому и возникает вон то самое. Вопрос — как исправить это дело, чтобы все стало хорошо? Или забить и использовать литералы?

 Профиль  
                  
 
 Re: const char[] в Си
Сообщение29.02.2012, 20:01 
Заслуженный участник


04/05/09
4582
Можно их объявить static, и тогда они, даже сдублированные, в линкере путаться не будут.
Если же вы хотите избежать дублирования, то можно их объявить extern в заголовке, и определить в одном из *.c.
Или по-простому использовать литералы (#define). Хотя, литералы могут дублироваться (стандарт это не запрещает), но в линкере они не будут мешать друг другу.

 Профиль  
                  
 
 Re: const char[] в Си
Сообщение29.02.2012, 21:04 
Заслуженный участник


19/07/08
1266
Есть же стандартный трюк. Каждый заголовочный файл начинается с
Код:
#ifndef VERY_LONG_NAME_WITH_FILENAME
#define VERY_LONG_NAME_WITH_FILENAME
// тут идёт сам заголовочный файл
#endif

И можно об этой проблеме забыть навсегда.

 Профиль  
                  
 
 Re: const char[] в Си
Сообщение29.02.2012, 21:11 
Заслуженный участник


04/05/09
4582
nestoklon в сообщении #543969 писал(а):
Есть же стандартный трюк. Каждый заголовочный файл начинается с
Код:
#ifndef VERY_LONG_NAME_WITH_FILENAME
#define VERY_LONG_NAME_WITH_FILENAME
// тут идёт сам заголовочный файл
#endif

И можно об этой проблеме забыть навсегда.
Проблема совсем в другом. И ваше предложение её не решает.

 Профиль  
                  
 
 Re: const char[] в Си
Сообщение29.02.2012, 21:12 
Заслуженный участник


09/09/10
3729
nestoklon
Вы думаете, там этого не вписано? Вписано, CodeBlocks это умеет. А сообщения все равно сыпались. Весело, а? Вот за эту свистопляску с тем, кто где объявлен, кто где описан, нету ли взаимозависимостей и т.п., я и не люблю Си/Си++.

-- Ср фев 29, 2012 22:14:00 --

venco
Спасибо за ответ, я объявил как static. Нет, ну подумать только — уж вторая декада двадцать первого века на дворе, а пользуемся языками, которые не могут самостоятельно распределить память под статические данные...

 Профиль  
                  
 
 Re: const char[] в Си
Сообщение29.02.2012, 21:58 
Заслуженный участник


19/07/08
1266
Joker_vD в сообщении #543973 писал(а):
Вы думаете, там этого не вписано?
Да, я думал там этого не вписано.

 Профиль  
                  
 
 Re: const char[] в Си
Сообщение29.02.2012, 22:10 
Заслуженный участник


31/12/05
1480
Файл utils.h:
Используется синтаксис C
extern const char COMM_SEND[];
extern const char COMM_LIST[];
extern const char COMM_GETM[];
extern const char COMM_QUIT[];


Файл utils.c:
Используется синтаксис C
const char COMM_SEND[] = "SEND ";
const char COMM_LIST[] = "LIST";
const char COMM_GETM[] = "GETM";
const char COMM_QUIT[] = "QUIT";

 Профиль  
                  
 
 Re: const char[] в Си
Сообщение03.03.2012, 11:24 
Аватара пользователя


30/09/10
119
Я делал так (еще в XX веке)
В h-файле
Код:
#if defined E
#define  EXT
#else
#define EXT extern
#endif
EXT ... // Ваши объявления

А в одном (только в одном!) c(cpp)-файле говорю
Код:
#define E

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group