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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
pEntity
11 / 6 / 1
Регистрация: 12.12.2012
Сообщений: 399
#1

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

08.03.2013, 20:59. Просмотров 893. Ответов 10
Метки нет (Все метки)

Здравствуйте.

В 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

Что же не так ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.03.2013, 20:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос ( extern char ) переопределение; (C++):

Error C2086: char cmd[1024]: переопределение при пинге ресурса - C++
Хочу программу заделать чтобы нагрузить немного свой сайт (в коде на примере гугла) #include <iostream> using namespace std; ...

Глобальное переопределение "operator <<" для char * - C++
Здравствуйте. Привожу пример для демонстрации проблемы. Помогите пожалуйста в ее устранении или нивелировании. std::ostream&amp;...

Extern в C/C++ - C++
Оговорка - собирал все под VS2015 и под него же с Clang'ом для убедительности. В первую очередь интересует актуальная для них информация,...

extern - C++
Собственно как правильно пользоваться такой штукой? 1. Где нужно использовать: 1) только в заголовочном файле 2) только в исходном...

Extern template - C++
Не могу понять, в книге пишут: Примерно понимаю, при компиляции будет добавлен код определения шаблона в каждый файл где он...

директива extern - C++
Никак н могу понять как решить проблму с директивой extern. Я подключил к проекту файл libext.h и попытался скомпилировать программу. И...

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

В хедер если всунуть,будет переопределение.
0
Desu_Is_A_Lie
62 / 62 / 3
Регистрация: 26.02.2012
Сообщений: 114
08.03.2013, 21:23 #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;
}
1
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
08.03.2013, 21:29 #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
};
1
pEntity
11 / 6 / 1
Регистрация: 12.12.2012
Сообщений: 399
08.03.2013, 21:32  [ТС] #6
Да,точно. Я читал в книгах,там приводилось подобное,но в силу того,что читая книгу,там много информации,все сразу без практики не запомнишь. Спасибо большое.

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

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

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

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

Практика с явным указанием размера (как в примере Kuzia domovenok) не является самой распространённой, т.к. если изменить размер массива, то его придётся переписывать везде. Впрочем, ради двух файлов можно и не заморачиваться и просто его таки явно указать. Так что всё зависит от того, где это будет использоваться.
1
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
08.03.2013, 22:00 #10
Цитата Сообщение от Desu_Is_A_Lie Посмотреть сообщение
Практика с явным указанием размера (как в примере Kuzia domovenok) не является самой распространённой, т.к. если изменить размер массива, то его придётся переписывать везде. Впрочем, ради двух файлов можно и не заморачиваться и просто его таки явно указать. Так что всё зависит от того, где это будет использоваться.
На самом деле, я был просто не совсем уверен, будет ли работать, если опустить размер при extern объявлении и решил подстраховаться.
1
pEntity
11 / 6 / 1
Регистрация: 12.12.2012
Сообщений: 399
08.03.2013, 22:09  [ТС] #11
Спасибо большое,друзья.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.03.2013, 22:09
Привет! Вот еще темы с ответами:

Проблема с extern-переменными - C++
Такие дела. У меня два файла, func.cpp и main.cpp //func.cpp double sum, count; double average(double num) { sum += num; ...

что такое extern? - C++
что будет если не написать extern,если можно с примерами

Ключевое слово extern - C++
Есть код в файле file1.cpp #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;string&gt; #include &quot;file2.cpp&quot; int main() { ...

Использование extern с функциями - C++
Добрый вечер! Скажем я задекларировал в каком-то модуле функцию extern void foo() ;. Но не описал её. Могу ли я при подключении...


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

Или воспользуйтесь поиском по форуму:
11
Yandex
Объявления
08.03.2013, 22:09
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru