utils.h
Code: Select all
#pragma once
inline int my_common_util_function_1() {
return 42;
}
foo.h
Code: Select all
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
int foo_a();
int foo_b();
#ifdef __cplusplus
}
#endif
Code: Select all
#include "utils.h"
#include "foo.h"
int foo_a() {
return my_common_util_function_1();
}
Code: Select all
#include "utils.h"
#include "foo.h"
int foo_b() {
return my_common_util_function_1();
}
Code: Select all
#include
#include "foo.h"
int main() {
printf("%d\n", foo_a());
printf("%d\n", foo_b());
}
Code: Select all
clang -c foo_c_impl.c -o foo_c_impl.o
clang -c foo_cpp_impl.cpp -o foo_cpp_impl.o
clang -c main.c -o main.o
clang foo_c_impl.o foo_cpp_impl.o main.o
# /usr/bin/ld: foo_c_impl.o: in function `foo_a':
# foo_c_impl.c:(.text+0x5): undefined reference to `my_common_util_function_1'
- eine .c-Datei speziell schreibe, um sie zu extern, oder
- Schreiben Sie sie als statische Inline in C, etwa so:
Code: Select all
#ifdef __cplusplus #define MY_INLINE inline #else #define MY_INLINE static inline #endif
Ich möchte also wissen, ob es in C eine Möglichkeit gibt, C++s Inline vollständig zu simulieren (einschließlich der Verwendung von Compiler-Erweiterungen)?
Außerdem, da mein Projekt nur auf Linux läuft Plattform habe ich gelernt, dass clang und gcc inline in C++ durch schwache Symbole implementieren, also habe ich darüber nachgedacht, __attribute__((weak)) und inline zusammen in C zu verwenden, um ähnliche Funktionen wie diese zu simulieren :
Code: Select all
#ifdef __cplusplus
#define MY_INLINE inline
#else
#define MY_INLINE inline __attribute__((weak))
#endif
Inline-Funktion 'my_common_util_function_1' für schwach erklärt
Ich bin nicht sicher, welches Verhalten der Seite korrekt ist.
Bearbeiten:
Mein Wunsch, statisches Inline in C zu vermeiden, basiert hauptsächlich auf den in dieser Antwort erwähnten Problemen.
Eine Sache, die ich in der vorherigen Beschreibung nicht erwähnt habe und die zu Verwirrung führen könnte, ist, dass die Funktionen in utils.h tatsächlich automatisch generiert werden. Die meisten von ihnen sind kurz, aber einige sind möglicherweise nicht so kurz. Ich hoffe, dass die Compiler-Optimierung entscheiden kann, ob sie eingebunden werden sollen. Wenn einige dieser Funktionen nicht inline sind, weil sie groß sind, dann hoffe ich, dass sie auch zum Linkzeitpunkt zusammengeführt werden können, anstatt mehrere Kopien zu behalten.