Форум программистов, компьютерный форум CyberForum.ru

( extern char ) переопределение; - C++

Восстановить пароль Регистрация
 
pEntity
10 / 5 / 1
Регистрация: 12.12.2012
Сообщений: 371
08.03.2013, 20:59     ( extern char ) переопределение; #1
Здравствуйте.

В file.cpp использую:

C++
1
2
3
4
5
char *SOUND_TRAPPED[ ]  =
{
    "zbm4/zombi_trapped.wav",       // male
    "zbm4/zombi_trapped_female.wav"     // female
};
Хотел использовать так же эти данные в file2.cpp, добавил

C++
1
2
3
4
5
extern char *SOUND_TRAPPED[ ]   =
{
    "zbm4/zombi_trapped.wav",       // male
    "zbm4/zombi_trapped_female.wav"     // female
};
1>file : error LNK2005: "char * * SOUND_TRAPPED" (?SOUND_TRAPPED@@3PAPADA) уже определен в file2.obj

Что же не так ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.03.2013, 20:59     ( extern char ) переопределение;
Посмотрите здесь:

директива extern C++
C++ Нахождение _export в теле extern
Проблема с extern-переменными C++
Не работает глобальный идентификатор extern C++
C++ что такое extern?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Desu_Is_A_Lie
 Аватар для Desu_Is_A_Lie
62 / 62 / 3
Регистрация: 26.02.2012
Сообщений: 114
08.03.2013, 21:12     ( extern char ) переопределение; #2
Во втором лишнее. Линкер же говорит, что объект уже определён. extern позволяет объявлять переменные в текущем модуле, а не инициализировать их.
Цитата Сообщение от pEntity Посмотреть сообщение
C++
1
2
"zbm4/zombi_trapped.wav", // male
"zbm4/zombi_trapped_female.wav" // female
pEntity
10 / 5 / 1
Регистрация: 12.12.2012
Сообщений: 371
08.03.2013, 21:16  [ТС]     ( extern char ) переопределение; #3
Спасибо,но я не понял как заюзать это в любом другом срр файле.

В хедер если всунуть,будет переопределение.
Desu_Is_A_Lie
 Аватар для Desu_Is_A_Lie
62 / 62 / 3
Регистрация: 26.02.2012
Сообщений: 114
08.03.2013, 21:23     ( extern char ) переопределение; #4
test1.cpp
C++
1
char *XTRNME[]  = {"SEX", "DRUGS", "PONY"};
test2.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//------------------------------------------------------------------------------
#include    <tchar.h>
#include    <cstdio>
#include    <cstdlib>
//------------------------------------------------------------------------------
 
extern char *XTRNME[];
 
int _tmain(int argc, _TCHAR* argv[])
{
    std::printf("Life is: %s, %s, %s.\n", XTRNME[0], XTRNME[1], XTRNME[2]);
    
    std::system("pause");
    return 0;
}
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
08.03.2013, 21:29     ( extern char ) переопределение; #5
extern это как раз способ не определять переменную, а сообщить, что она определена в другом срр файле.
externы как раз-таки можно прописывать в заголовочных h файлах.
Естесственно, т.к. extern это не определение, инициализироать чем-либо эту переменную не следует.
C++
1
2
3
4
5
6
7
8
9
//test.h
extern char *SOUND_TRAPPED[2];
 
////test.с
char *SOUND_TRAPPED[ ] =
{
     "zbm4/zombi_trapped.wav",      // male
     "zbm4/zombi_trapped_female.wav"      // female
};
pEntity
10 / 5 / 1
Регистрация: 12.12.2012
Сообщений: 371
08.03.2013, 21:32  [ТС]     ( extern char ) переопределение; #6
Да,точно. Я читал в книгах,там приводилось подобное,но в силу того,что читая книгу,там много информации,все сразу без практики не запомнишь. Спасибо большое.

Добавлено через 2 минуты
Kuzia domovenok,а вот вы указали размерность,а Desu_Is_A_Lie этого не сделал,это не принципиально указывать размер массива ? Так или иначе я все равно возьму с него данные.
Desu_Is_A_Lie
 Аватар для Desu_Is_A_Lie
62 / 62 / 3
Регистрация: 26.02.2012
Сообщений: 114
08.03.2013, 21:41     ( extern char ) переопределение; #7
Нет.

Однако, стоит заметить, что это будет являться неполным типом, поэтому взять с него sizeof() не получится. В данном случае (два .cpp) это можно решить либо ещё одной переменной (int arrsize = sizeof(...) || extern arrsize), либо дописывание предустановленного значения (например ноль) и затем поиском этого значения (и, соответственно, размера массива) в цикле.
pEntity
10 / 5 / 1
Регистрация: 12.12.2012
Сообщений: 371
08.03.2013, 21:51  [ТС]     ( extern char ) переопределение; #8
А sizeof() берет размер и + 1 ?

Я обычно пользуюсь
C++
1
#define ARRAYSIZE(p)        (sizeof(p)/sizeof(p[0]))
Desu_Is_A_Lie
 Аватар для Desu_Is_A_Lie
62 / 62 / 3
Регистрация: 26.02.2012
Сообщений: 114
08.03.2013, 21:56     ( extern char ) переопределение; #9
sizeof() просто даёт размер в байтах.

С вышеприведённым массивом оно завалится на этом: sizeof(p). Поэтому если таки потребуется узнать размер, то желательно использовать вышеописанные методы.

Практика с явным указанием размера (как в примере Kuzia domovenok) не является самой распространённой, т.к. если изменить размер массива, то его придётся переписывать везде. Впрочем, ради двух файлов можно и не заморачиваться и просто его таки явно указать. Так что всё зависит от того, где это будет использоваться.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
08.03.2013, 22:00     ( extern char ) переопределение; #10
Цитата Сообщение от Desu_Is_A_Lie Посмотреть сообщение
Практика с явным указанием размера (как в примере Kuzia domovenok) не является самой распространённой, т.к. если изменить размер массива, то его придётся переписывать везде. Впрочем, ради двух файлов можно и не заморачиваться и просто его таки явно указать. Так что всё зависит от того, где это будет использоваться.
На самом деле, я был просто не совсем уверен, будет ли работать, если опустить размер при extern объявлении и решил подстраховаться.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.03.2013, 22:09     ( extern char ) переопределение;
Еще ссылки по теме:

extern C++
Error C2086: char cmd[1024]: переопределение при пинге ресурса C++
C++ Использование extern с функциями

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
pEntity
10 / 5 / 1
Регистрация: 12.12.2012
Сообщений: 371
08.03.2013, 22:09  [ТС]     ( extern char ) переопределение; #11
Спасибо большое,друзья.
Yandex
Объявления
08.03.2013, 22:09     ( extern char ) переопределение;
Ответ Создать тему
Опции темы

Текущее время: 06:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru