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

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

Войти
Регистрация
Восстановить пароль
 
krazyd
16 / 0 / 0
Регистрация: 10.11.2012
Сообщений: 96
#1

Использование extern с функциями - C++

05.07.2015, 00:01. Просмотров 839. Ответов 11
Метки нет (Все метки)

Добрый вечер!

Скажем я задекларировал в каком-то модуле функцию
C++
1
extern void foo() ;
. Но не описал её. Могу ли я при подключении этого модуля к моей программе описать тело этой функции в самой программе?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2015, 00:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Использование extern с функциями (C++):

Использование слова extern для структур - C++
В одном из файлов проекта задана структура: struct TMsgTV { int X,Y; char *Msg; } Далее была объявлена...

Использование static переменной через extern - C++
Есть форма, на ней две кнопки. Одна кнопка по нажатию добавляет элементы в класс-массив. Код первой клавиши: ...

Организация кода, вывод строки в консоли, использование extern - C++
Windows 7, Visual Studio 2013. В проекте файлы:// TestCpp.h using namespace std; extern settings set; bool TestCpp() { ...

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
jonson
232 / 205 / 61
Регистрация: 18.03.2010
Сообщений: 750
05.07.2015, 00:19 #2
можешь. extern там не нужен
1
krazyd
16 / 0 / 0
Регистрация: 10.11.2012
Сообщений: 96
05.07.2015, 00:25  [ТС] #3
А как тогда сделать?
0
jonson
232 / 205 / 61
Регистрация: 18.03.2010
Сообщений: 750
05.07.2015, 00:33 #4
fileH.h
C++
1
void foo() ;
fileCPP.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include "fileH.h"
 
void foo()
{
    std::cout << "my function foo()";
}
 
int main ()
{
    foo();  
    system("pause");
    return 0;
}
1
krazyd
16 / 0 / 0
Регистрация: 10.11.2012
Сообщений: 96
05.07.2015, 00:36  [ТС] #5
А если у меня есть функция в модуле, которая использует эту foo() ? Они тогда нормально работать будут?
0
jonson
232 / 205 / 61
Регистрация: 18.03.2010
Сообщений: 750
05.07.2015, 00:38 #6
но и fileH.h там чисто формально. При описании ты и так ее определяешь.
Цитата Сообщение от krazyd Посмотреть сообщение
у меня есть функция в модуле
в каком модуле?
0
Max Dark
шКодер самоучка
1825 / 1627 / 592
Регистрация: 09.10.2013
Сообщений: 3,634
Записей в блоге: 6
Завершенные тесты: 2
05.07.2015, 00:44 #7
some.cpp
C++
1
2
3
4
extern void foo();
void bar() {
    foo();
}
main.cpp
C++
1
2
3
4
5
6
7
8
9
extern void bar();
extern "C" int puts(const char*);
void foo() {
    puts("test");
}
int main() {
    bar();
    return 0;
}
extern говорит что символ будет описан в другом модуле, а в каком именно - на этапе компиляции не важно
главное чтобы на этапе компоновки все нашлось

Добавлено через 2 минуты
PS: собирается это следующими командами
Bash
1
2
3
g++ -c some.cpp
g++ -c main.cpp
g++ some.o main.o -o test_extern
1
krazyd
16 / 0 / 0
Регистрация: 10.11.2012
Сообщений: 96
05.07.2015, 00:50  [ТС] #8
jonson, В мною созданном.

Cra3y, благодарю!

Cra3y, а можете поподробнее рассказать про
C++
1
extern "C" int puts(const char*);
?
0
DrOffset
7155 / 4296 / 972
Регистрация: 30.01.2014
Сообщений: 7,101
05.07.2015, 00:56 #9
krazyd, только вот просто extern перед функций писать не обязательно. Функция итак по умолчанию имеет внешнее связывание.
1
krazyd
16 / 0 / 0
Регистрация: 10.11.2012
Сообщений: 96
05.07.2015, 00:57  [ТС] #10
DrOffset, вы имеете в виду если она в header указана?
0
Max Dark
шКодер самоучка
1825 / 1627 / 592
Регистрация: 09.10.2013
Сообщений: 3,634
Записей в блоге: 6
Завершенные тесты: 2
05.07.2015, 01:22 #11
Цитата Сообщение от krazyd Посмотреть сообщение
а можете поподробнее рассказать
тут надо понимать как компилятор именует функции
в С++ типы параметров и возвращаемого значения входит в конечное имя функции
в Си функции распознаются только по имени
так вот чтобы в С++ вызвать функцию из Си библиотеки нужно явно указать, что эта функция именуется в стиле си
иначе компилятор оформит вызов как С++ и компоновщик не сможет ее найти, т.к. будет искать по полному имени.

jonson, в main.cpp происходит вызов функции bar(), описанной в some.cpp, а функция puts описана в стандартной библиотеке, но в main.cpp нет подключения заголовков через include
2
Croessmah
Эксперт CЭксперт С++
13234 / 7506 / 846
Регистрация: 27.09.2012
Сообщений: 18,440
Записей в блоге: 3
Завершенные тесты: 1
05.07.2015, 01:46 #12
Цитата Сообщение от krazyd Посмотреть сообщение
вы имеете в виду если она в header указана?
имеется ввиду, что не надо писать extern в прототипе функции, т.к. функции по умолчанию extern:
C++
1
void foo() ; //это extern void foo() ;
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.07.2015, 01:46
Привет! Вот еще темы с ответами:

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

Зачем нужен extern? - C++
Знаю, что в интернете полно объяснений зачем он, но я не могу понять... Везде пишут, что он &quot;позволяет объявить переменную без её...

Ключевое слово 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 char ) переопределение; - C++
Здравствуйте. В file.cpp использую: char *SOUND_TRAPPED = { &quot;zbm4/zombi_trapped.wav&quot;, // male ...


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

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

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