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

Вызов функции из другого файла - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
Xipxop
 Аватар для Xipxop
481 / 9 / 2
Регистрация: 28.12.2011
Сообщений: 150
10.01.2013, 22:33     Вызов функции из другого файла #1
Знаю этот вопрос, задавался не раз(возможно), но поиск показал одну тему в которой, небыло дано ясного ответа...

Так вот в чем вопрос:

Есть файл main.cpp
C++
1
2
3
4
5
6
#include "menu.cpp"
 
int main()
{
    menu();
}
И файл menu.cpp ( в тойже папке)
C++
1
2
3
4
void menu()
{
    //...
}
Так вот: когда все это компилирую, то мне пишет, что эта функция menu() задается много раз!


P.S.

main.cpp
C++
1
2
3
4
5
6
7
8
#include "menu.cpp"
 
extern menu();
 
int main()
{
    menu();
}

menu.cpp
C++
1
2
3
4
void menu()
{
    //...
}
extern menu(); НЕ работает!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.01.2013, 22:33     Вызов функции из другого файла
Посмотрите здесь:

Считать одномерный массив с файла, отсортировать его использую рекурсивный вызов функции C++
C++ как может корректно выполняющийся оператор >> (чтение из текстового файла) негативно влиять на открытие другого файла?
C++ Вызов из разных потоков функции чтения из файла, dll
Создание и вызов файла с описанием функции C++
Вызов метода в классе из другого C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Issues
429 / 364 / 37
Регистрация: 06.08.2012
Сообщений: 961
10.01.2013, 22:46     Вызов функции из другого файла #2
прототипы нужно писать в заголовочных файлах (.h)
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
10.01.2013, 22:46     Вызов функции из другого файла #3
C++
1
2
3
4
5
6
//#include "menu.cpp"//Кто так учил делать? Уберите эту строчку от греха подальше
 extern void menu();
int main()
{
    menu();
}
или заголовочный фаил делайте.
Почитайте про раздельную компиляцию, а еще лучше поработайте с MinGW(GCC)
Issues
429 / 364 / 37
Регистрация: 06.08.2012
Сообщений: 961
10.01.2013, 22:58     Вызов функции из другого файла #4
добавь файл "menu.h" записав в него:

C++
1
2
3
4
5
6
#ifndef MENU_H
#define MENU_H
 
void menu();
 
#endif
Xipxop
 Аватар для Xipxop
481 / 9 / 2
Регистрация: 28.12.2011
Сообщений: 150
10.01.2013, 23:05  [ТС]     Вызов функции из другого файла #5
незнаю, но то что вы написали вызывает гору ошибок

main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <cstdlib>
#include <iostream>
#include <windows.h>  //CharToOem
#include <conio.h>  //_getch()
 
#define rus(str) CharToOem(str,vixod); //Ïñåâäî ГґГіГ*êöèÿ, äëÿ ïåðåâîäГ* êîäèðîâêè
#define strelka "<-----"
#include "menu.h"
 
using namespace std;
 
char vixod[512]; //ÏåðåìåГ*Г*Г*Гї ñîäåðæГ*Г№Г*Гї ГђГіГ±Г±ГЄГЁГ© ГІГҐГЄГ±ГІ
 
extern void menu();
 
int main(int argc, char *argv[])
{
    menu(); //âûçûâГ*ГҐГ¬ ìåГ*Гѕ èãðû
    system("PAUSE");
    return EXIT_SUCCESS;
}
menu.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#ifndef MENU_H
#define MENU_H
#include <iostream>
#define strelka "<-----"
#define rus(str) CharToOem(str,vixod); //Ïñåâäî ГґГіГ*êöèÿ, äëÿ ïåðåâîäГ* êîäèðîâêè
void menu() 
{
    system("cls"); //ГЋГ·ГЁГ№Г*ГҐГ¬ ГЅГЄГ°Г*Г*
    
    int ch=0,chose=1;
    bool exit=true;
    char *vibor[3];
    vibor[1]=strelka; vibor[2]=""; vibor[3]="";
    
    while(exit)
    {
        system("cls");
        rus("Ìîðñêîé áîé Гў ГЄГ®Г*ñîëå.\n*****_ГЊГҐГ*Гѕ:_*****\n"); cout << vixod << endl;
        rus("ÈãðГ*ГІГј"); cout << vixod << vibor[1] << endl;
        rus("ГЏГ°Г*ГўГЁГ«Г*"); cout << vixod << vibor[2] << endl;
        rus("ГЌГ*ñòðîéêè"); cout << vixod << vibor[3] << endl;
        cout << ch;
        ch=_getch();
        switch(ch)
        {
            case 80: //ГўГ*ГЁГ§
                vibor[chose]="";
                if (chose>2){chose=1;} else{chose++;}
                vibor[chose]=strelka;
            break;
            
            case 72: //ââåðõ
                vibor[chose]="";
                if (chose<2){chose=3;} else{chose--;}
                vibor[chose]=strelka;
            break;
            
            case 13: //enter
                exit=false;
            break;
        }
        
        //if(chose==1){game();} else{if(chose==2){pravila();} else{setting();}}
    }
} 
 
#endif
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
10.01.2013, 23:08     Вызов функции из другого файла #6
Цитата Сообщение от Xipxop Посмотреть сообщение
незнаю, но то что вы написали вызывает гору ошибок
Открываете книги и читаете главы "Заголовочные файлы", "Линковка программы", "Внешняя линковка", "Раздельная компиляция","Прототипы функций". Вопрос отпадет сам собой. А толку объяснять Вам все это на форуме?
Issues
429 / 364 / 37
Регистрация: 06.08.2012
Сообщений: 961
10.01.2013, 23:09     Вызов функции из другого файла #7
Xipxop, напишите что то одно

Добавлено через 29 секунд
или h или extern
Xipxop
 Аватар для Xipxop
481 / 9 / 2
Регистрация: 28.12.2011
Сообщений: 150
10.01.2013, 23:16  [ТС]     Вызов функции из другого файла #8
Спасибо все понял, (я #include "menu.h" пихал до using namespace std; и из-за этого и ошибка)


Croessmah, толк есть, по книгам учится не у каждого получается.
P.S. Из того что я понял, для Croessmah
мы в отдельном файле сделали define и прикрепили его в другой, при компиляции получаем 1 файл, где функция menu() будет подставлена на место её иницилизации
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
10.01.2013, 23:18     Вызов функции из другого файла #9
Не нужно писать extern. Вполне будет работать и так:

C++
1
2
3
4
5
6
7
8
//main.cpp
void menu();
 
int main() {
   menu();
 
   return 0;
}
C++
1
2
3
4
5
6
//menu.cpp
#include <iostream>
 
void menu() {
   std::cout << "hello from menu" << std::endl;
}
Bash
1
g++ main.cpp menu.cpp -o main
Заголовочные файлы, по больше части, нужны для согласования.
coloc
погромист
 Аватар для coloc
409 / 245 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
10.01.2013, 23:38     Вызов функции из другого файла #10
функции по умолчанию и так все extern
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.01.2013, 23:43     Вызов функции из другого файла
Еще ссылки по теме:

C++ Как сделать доступными функции из другого проекта инклудом .h файла
C++ Вызов функции из другого файла.
Вызов статического метода из другого класса C++

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
10.01.2013, 23:43     Вызов функции из другого файла #11
Цитата Сообщение от coloc Посмотреть сообщение
функции по умолчанию и так все extern
прототипы. А со static, так вообще не видно будет.
Yandex
Объявления
10.01.2013, 23:43     Вызов функции из другого файла
Ответ Создать тему
Опции темы

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