Вы можете обрабатывать файлы заголовков, как будто они скопированы в ваши файлы реализации. Таким образом, помещая определения функций в заголовки, эти определения появляются в нескольких единицах перевода (грубо говоря, файлы компилятора .cpp
). Это недопустимо - как компилятор должен сообщать между ними, если они окажутся разными?
Обычно у вас будет пара .h
/ .cpp
с объявлениями функций, идущими в .h
, и определения функций в .cpp
. Таким образом, определение появляется только один раз во всей вашей программе.
Я могу разделить ваш код следующим образом:
ab c .hpp:
#ifndef __ABC_HPP__
#define __ABC_HPP__
// function **declarations**
namespace abc{
void sendtext(const char* msg);
void sendtextwitherrno(const char* msg, int errn);
}
#endif
ab c. cpp:
#include "abc.hpp"
#include "context.hpp" // I guess this might be where create_context and send_context come from
// function **definitions**
namespace abc{
void sendtext(const char* msg){
create_context(mycontext); // not sure where mycontext is supposed to live?
send_context(create_context,msg)
}
void sendtextwitherrno(const char* msg, int errn){
create_context(mycontext);
send_context(create_context,msg, errn);
}
}
тест. cpp:
#include "abc.hpp"
int main(){
abc::sendtext("hello world");
abc::sendtextwitherrno("hello error no",140);
return 0;
}
Другой способ - пометить функции как inline
- это говорит компилятору, что вы намеренно повторяете определение функции повсюду, и вам лучше убедиться, что определение всегда идентично. Насколько ты уверен? Существуют ли разные макросы или разные флаги компилятора в разных местах, где используется функция?