2014 dxdy logo

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

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




 
 const char[] в Си
Сообщение29.02.2012, 19:52 
Чего-то я туплю... а может, я вовсе пытаюсь сделать глупую вещь?

Файл 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 
Можно их объявить static, и тогда они, даже сдублированные, в линкере путаться не будут.
Если же вы хотите избежать дублирования, то можно их объявить extern в заголовке, и определить в одном из *.c.
Или по-простому использовать литералы (#define). Хотя, литералы могут дублироваться (стандарт это не запрещает), но в линкере они не будут мешать друг другу.

 
 
 
 Re: const char[] в Си
Сообщение29.02.2012, 21:04 
Есть же стандартный трюк. Каждый заголовочный файл начинается с
Код:
#ifndef VERY_LONG_NAME_WITH_FILENAME
#define VERY_LONG_NAME_WITH_FILENAME
// тут идёт сам заголовочный файл
#endif

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

 
 
 
 Re: const char[] в Си
Сообщение29.02.2012, 21:11 
nestoklon в сообщении #543969 писал(а):
Есть же стандартный трюк. Каждый заголовочный файл начинается с
Код:
#ifndef VERY_LONG_NAME_WITH_FILENAME
#define VERY_LONG_NAME_WITH_FILENAME
// тут идёт сам заголовочный файл
#endif

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

 
 
 
 Re: const char[] в Си
Сообщение29.02.2012, 21:12 
nestoklon
Вы думаете, там этого не вписано? Вписано, CodeBlocks это умеет. А сообщения все равно сыпались. Весело, а? Вот за эту свистопляску с тем, кто где объявлен, кто где описан, нету ли взаимозависимостей и т.п., я и не люблю Си/Си++.

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

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

 
 
 
 Re: const char[] в Си
Сообщение29.02.2012, 21:58 
Joker_vD в сообщении #543973 писал(а):
Вы думаете, там этого не вписано?
Да, я думал там этого не вписано.

 
 
 
 Re: const char[] в Си
Сообщение29.02.2012, 22:10 
Файл 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 
Аватара пользователя
Я делал так (еще в XX веке)
В h-файле
Код:
#if defined E
#define  EXT
#else
#define EXT extern
#endif
EXT ... // Ваши объявления

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

 
 
 [ Сообщений: 8 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group