Как вызвать функцию c ++ без включения файла заголовка и дублирования?

Я делаю C ++ кодирование.

Из файла f2.cpp мне нужно вызвать функцию f1 (), определенную в f1.cpp, но не удаленную в f1.h.

Я не могу сделать это, включив f1.h в f2.cpp.

Я не хочу определять другую функцию, которая делает то же самое, это дублирование.

Как решить эту проблему ?

Спасибо

ОБНОВЛЕНО

Прочитав решения, я собираюсь добавить деклирацию f1 () в f1.h.

в f1.h он имеет

namespace name1{
namespace name2{
class class1{};
class class2{};
}
}

f1 () — это просто служебная функция, которая не касается членов clas1 и class2.

В настоящее время f1 () определена в пространстве имен (без имени) в f1.cpp.

namespace{
f1(){

}
}

Но в f1.h он имеет определение пространства имен name1 и name2.

Где я должен поместить f1 () declearation в f1.h?

Теперь я поместил f1 () в name1 :: name2 в f1.h и включил f1.h в f2.cpp, я получил ошибку ссылки:
undefiend name1 :: name2 :: f1 () из f2 ().

ОБНОВЛЕНО
Если я помещаю замедление f1 () в f1.h вне пространства имен, а также включаю f1.h из f2.cpp, я получаю ошибку ссылки: неопределенный символ f1 () в f2 (), почему?

Любая помощь будет оценена!

3

Решение

Объявите функцию как extern в f2.cpp

//f2.cpp
extern void f();   //function declared but defined elsewhere

int main() {
f();
}

//f1.cpp
void f() {
//function declaration
}

g ++ f2.cpp f1.cpp, будет работать нормально.

Сказав это, вы также можете сделать #include из f2.cpp, который будет работать, но это определенно плохая идея, потому что, если вы скомпилируете оба файла вместе, у вас будет многократная ошибка определения. Если в вашем контроле правильно было бы иметь f1.h с объявлением функции.

ОБНОВЛЕНИЕ: Для вашего измененного вопроса с использованием пространств имен, используя безымянное пространство имен вокруг f (), вы явно указываете компилятору ограничить видимость функции только этим файлом. Вы можете перейти в именованное пространство имен, а затем обратиться к его объявлению в заголовочном файле.

2

Другие решения

Функция утилиты, которую вы хотите использовать, находится в анонимном пространстве имен, которое по своей сути похоже на static, Это делает функцию видимой только для этого исходного файла.

Если вы не хотите перемещать функцию из f1.cpp, то вам нужно каким-то образом сделать интерфейс к служебной функции публичным. Одним из способов является перемещение функции в новое пространство имен с именем, что-то вроде f1_util возможно. Затем вы можете объявить о наличии функции полезности в f1.h,

// f1.cpp
namespace {
// move f1() out of this
}
namespace f1_util {
void f1(){
//...
}
}
using namespace f1_util;
//... rest of f1.cpp

// f1.h
namespace f1_util {
void f1();
}
//... rest of f1.h

Может быть лучше переместить служебную функцию в новый исходный файл, скажем, util.cppи убедитесь, что он не находится в анонимном пространстве имен. Затем определите util.h это заявляет об этом. Тогда есть оба f1.cpp а также f2.cpp включить util.h,

1

Поместите декларацию f1() в f2.cpp, Расположение объявления не имеет значения для компилятора, это просто соглашение о программировании, согласно которому объявления и определения помещаются в соответствующие заголовочные и исходные файлы. Тем не менее, это хорошая практика: если вы меняете заголовок функции в f1.cpp, вам нужно только обновить эту декларацию в f1.hВы не должны искать это во всех других .cpp файлы, которые вызывают функцию. По этой причине мы используем заголовочные файлы, в первую очередь, для модульности.

0

Почему бы вам просто не включить f1.cpp или не объявить функцию в f1.h?

-1
По вопросам рекламы [email protected]