Как вызвать функцию из нескольких файлов cpp - PullRequest
0 голосов
/ 17 мая 2018

Как включить и использовать функцию в нескольких файлах cpp?

// my_function.h
void func_i_want_to_include();

// my_function.cpp
void func_i_want_to_include()
{
    puts("hello world");
}


//main.cpp
#include "my_function.h"
#include "file_b.h"

int main()
{
     call_to_file_b();
     func_i_want_to_include();
     return 0;
}

//file_b.h
void call_to_file_b();

//file_b.cpp
#include "my_function.h"

void call_to_file_b()
{
     puts("from file b\n");
     func_i_want_to_include();
}

Когда я делаю это таким образом, я получаю доход с помощью компоновщика "unreolve external symbol", я предполагаю, что компоновщик прошел func_i_want_to_include() 2 раза вместо того, чтобы понять, что это та же самая функция.

Как мне сказать ему: «Это та же самая функция, просто вызовите ее из 2 файлов, но не пытайтесь сделать 2 копии одной и той же функции?»

Ответы [ 4 ]

0 голосов
/ 17 мая 2018

Во-первых, как упомянул @LuisGP, вам нужен #ifndef, если ваш заголовочный файл включен много раз.Во-вторых, в связанный cpp-файл вам необходимо включить заголовочный файл.Заголовочный файл объявляет функцию, файл cpp описывает функцию.Наконец, все файлы cpp должны быть включены при компиляции (просто используйте командную строку, если редактор не работает).Это выглядит так:

gcc -c my_function.cpp file_b.cpp //this will make a my_function.o and a file_b.o file
gcc -o main main.cpp my_function.o file_b.o 

или для краткости:

gcc -o main main.cpp my_function.cpp file_b.cpp

Вот как должны записываться файлы:

// my_function.h
#ifndef _my_function_h
#define _my_function_h

void func_i_want_to_include(); 

#endif


// my_function.cpp
#include <stdio.h>
#include "my_function.h"

void func_i_want_to_include()
{
    puts("hello world");
}


//file_b.h
#ifndef _file_b_h
#define _file_b_h

void call_to_file_b();

#endif


//file_b.cpp
#include <stdio.h>
#include "my_function.h"
#include "file_b.h"

void call_to_file_b()
{
     puts("from file b\n");
     func_i_want_to_include();
}


//main.cpp
#include "my_function.h"
#include "file_b.h"

int main()
{
     call_to_file_b();
     func_i_want_to_include();
     return 0;
}

Это мой первый разОтвечая на вопрос, если я сделаю какую-либо ошибку, скажите мне, и я исправлю это.Надеюсь, это поможет.

0 голосов
/ 17 мая 2018

Вы должны создать заголовочный файл.Внутри этого файла создайте объект и реализуйте публичную функцию внутри класса.

0 голосов
/ 17 мая 2018

Как сказал eozd, заголовочные файлы предназначены для объявлений. Но ваша проблема в том, что ваш заголовочный файл включается несколько раз, по одному на каждое предложение #include. Вы можете решить это добавление

#pragma once

В верхней части заголовка или по старинке:

#ifndef _MY_HEADER_FILE_H_
#define _MY_HEADER_FILE_H_

// Stuff

#endif // _MY_HEADER_FILE_H_
0 голосов
/ 17 мая 2018

Если вы хотите поместить определение функции в заголовочный файл, вам нужно сделать функцию встроенной.

// my_function.h
inline void func_i_want_to_include()
{
    puts("hello world");
}

В противном случае компилятор создаст одну функцию для каждого файла cpp, в который включен заголовочный файл, и компоновщик не будет знать, какой из них выбрать.

Вот почему вы обычно разделяете объявления функций

void func_i_want_to_include();

из определения функций

void func_i_want_to_include()
{
    puts("hello world");
}

Где первый идет в файл заголовка, а последний - в исходный файл.

...