C-Äquivalent von C++ inlineC++

Programme in C++. Entwicklerforum
Guest
 C-Äquivalent von C++ inline

Post by Guest »

Ich arbeite an einem Projekt mit gemischter C- und C++-Programmierung, in dem es auf beiden Seiten viele kurze (meistens), aber sehr häufig verwendete Dienstprogrammfunktionen gibt, und ich füge sie alle in eine einheitliche Header-Datei ein.
utils.h

Code: Select all

#pragma once
inline int my_common_util_function_1() {
return 42;
}
Das Folgende ist, wie ich es voraussichtlich verwenden werde:
foo.h

Code: Select all

#pragma once
#ifdef __cplusplus
extern "C" {
#endif
int foo_a();
int foo_b();
#ifdef __cplusplus
}
#endif
foo_c_impl.c

Code: Select all

#include "utils.h"
#include "foo.h"
int foo_a() {
return my_common_util_function_1();
}

foo_cpp_impl.cpp

Code: Select all

#include "utils.h"
#include "foo.h"
int foo_b() {
return my_common_util_function_1();
}
main.c

Code: Select all

#include 
#include "foo.h"
int main() {
printf("%d\n", foo_a());
printf("%d\n", foo_b());
}
Aber wenn ich das obige Beispiel mit dem folgenden Befehl kompiliere, schlägt es offensichtlich fehl.

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'
Nachdem ich diese Antwort gelesen hatte, erfuhr ich, dass dies daran zu liegen scheint, dass das Schlüsselwort inline in C++ und C unterschiedliche Bedeutungen hat (ich kannte es vorher nur in C++ und dachte darüber nach in C war es genauso. In C scheint es, dass ich entweder:
  • 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
    
Aber ich denke, dass keine dieser beiden Lösungen mein Problem perfekt löst. Erstens hoffe ich, dass diese Header-Datei in C und C++ die gleiche (oder zumindest ähnliche) Verwendung und ein ähnliches Verhalten aufweist. Zweitens, im schlimmsten Fall, da ich möglicherweise viele Kompilierungseinheiten habe, die utils.h enthalten, führt die Verwendung von static inline dazu, dass sie in jeder vorhanden sind, falls der Compiler beschließt, einige Dienstprogrammfunktionen nicht zu inline Kompilierungseinheit.
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
Nach dem Testen kann dies in Clang kompiliert werden und scheint den gewünschten Effekt zu erzielen, aber gcc meldet eine Warnung und führt immer noch zu einer undefinierten Referenz:

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.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post