Jest jeszcze jeden powód dlaczego nie powinno się includować plików .cpp
. IDE (np. Visual studio) czy inne systemy budowania mogą z automatu traktować te pliki jako oddzielną jednostkę translacji i osobno kompilować a na końcu linkować. Jak się samemu skrobie Makefile to by to mogło jakoś zadziałać ale rozszerzenie cpp
wskazuje na to że z tego pliku powstanie costam.o/obj
.
W bibliotekach czysto nagłówkowych, w których jest zawarty cały kod trzeba zadbać o to aby definicje się nie powtórzyły. Popularnym rozwiązaniem jest tworzenie makra w stylu MYLIB_IMPLEMENTATION
, które użytkownik biblioteki powinien zdefiniować tylko w jednym pliku źródłowym.
// mylib.h
#pragma once
void fun();
#ifdef MYLIB_IMPLEMENTATION
void fun() {
// implementation
}
#endif
#define MYLIB_IMPLEMENTATION
#include "mylib.h"
int main() {
}
oczywiście taki kod biblioteki powinien mieć rozszerzenie *.h/hpp
żeby IDE nie próbował tego oddzielnie kompilować. Niektórzy tworzą w projektach dla takich bibliotek krótki plik źródłowy gdzie jest definicja makra i inkdowanie, np:
// mylib_implementation.c
#define MYLIB_IMPLEMENTATION
#include "mylib.h"