Gibt es eine Möglichkeit zu überprüfen, ob eine bestimmte Funktion mit C-Verknüpfung (also mit extern "C"
) zur Kompilierzeit deklariert ist?Überprüfen, ob eine Funktion C-Verknüpfung zur Kompilierungszeit hat [nicht auflösbar]
Ich entwickle ein Plugin-System. Jedes Plugin kann dem Plugin-Ladecode Factory-Funktionen zur Verfügung stellen. Dies muss jedoch über den Namen (und anschließende Verwendung von GetProcAddress
oder dlsym
) erfolgen. Dies erfordert, dass die Funktionen mit C-Verknüpfung deklariert werden, um eine Namensänderung zu verhindern. Es wäre schön, in der Lage zu sein, einen Compiler-Fehler zu werfen, wenn die referenzierte Funktion mit C++ - Verknüpfung deklariert wird (im Gegensatz zur Feststellung, dass zur Laufzeit eine Funktion mit diesem Namen nicht existiert).
Hier ist ein vereinfachtes Beispiel dafür, was ich meine:
extern "C" void my_func()
{
}
void my_other_func()
{
}
// Replace this struct with one that actually works
template<typename T>
struct is_c_linkage
{
static const bool value = true;
};
template<typename T>
void assertCLinkage(T *func)
{
static_assert(is_c_linkage<T>::value, "Supplied function does not have C-linkage");
}
int main()
{
assertCLinkage(my_func); // Should compile
assertCLinkage(my_other_func); // Should NOT compile
}
Gibt es eine mögliche Implementierung von is_c_linkage
, die einen Compiler-Fehler für die zweite Funktion werfen würden, aber nicht die erste? Ich bin mir nicht sicher, ob das möglich ist (obwohl es als Compiler-Erweiterung existieren könnte, von der ich immer noch gerne wissen würde). Vielen Dank.
Ich vermute stark, dass dies nicht getan werden kann - vor allem nicht in einer Standard-Art und Weise. Interessante Frage. –
Ich bin mir da nicht so sicher. Aber selbst wenn es möglich wäre, ist es sehr wahrscheinlich, dass GCC es nicht unterstützt, da es die Unterscheidung eines externen "C" - und eines externen "C++" - Funktionstyps nicht kennt. So behandelt es beide Arten gleich. –
Wenn Sie zu implementationsspezifischem Wissen gehen, können Sie es auch für diese Implementierung verwenden, anstatt einen Fehler zu werfen. –