Я делаю 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 (), почему?
Любая помощь будет оценена!
Объявите функцию как 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 (), вы явно указываете компилятору ограничить видимость функции только этим файлом. Вы можете перейти в именованное пространство имен, а затем обратиться к его объявлению в заголовочном файле.
Функция утилиты, которую вы хотите использовать, находится в анонимном пространстве имен, которое по своей сути похоже на 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
,
Поместите декларацию f1()
в f2.cpp
, Расположение объявления не имеет значения для компилятора, это просто соглашение о программировании, согласно которому объявления и определения помещаются в соответствующие заголовочные и исходные файлы. Тем не менее, это хорошая практика: если вы меняете заголовок функции в f1.cpp
, вам нужно только обновить эту декларацию в f1.h
Вы не должны искать это во всех других .cpp
файлы, которые вызывают функцию. По этой причине мы используем заголовочные файлы, в первую очередь, для модульности.
Почему бы вам просто не включить f1.cpp или не объявить функцию в f1.h?