Es ist schwierig, von Linux zu OS/X zu portieren. Ich habe eine Inline-Funktion in einem anderen Funktionskörper eingebettet. Unter Linux hat gcc den Code gerne kompiliert, aber unter OS/X meldet clang einen Fehler. HierClang Problem: Inline-Funktion in einem anderen Funktionskörper in C
ist der Code-Schnipsel,
$ cat inline.c
void func() {
inline int max(int a, int b) { return (a>b) ? a : b; }
int c = max(11,22);
}
Unter Linux alles in Ordnung ist,
Linux $ gcc -c inline.c
Linux $$ gcc --version
gcc (Ubuntu 5.2.1-22ubuntu2) 5.2.1 20151010
jedoch Klirren auf OS/X beklagt,
OSX $ cc -c inline.c
inline.c:2:38: error: function definition is not allowed here
inline int max(int a, int b) { return (a>b) ? a : b; }
^
inline.c:3:17: warning: implicit declaration of function 'max' is invalid in C99
[-Wimplicit-function-declaration]
int c = max(11,22);
^
1 warning and 1 error generated.
OSX $ cc --version
Apple LLVM version 7.3.0 (clang-703.0.31)
Target: x86_64-apple-darwin15.5.0
Ist das ein gcc "feature" oder gibt es ein clang flag, um diese Fähigkeit zu aktivieren?
Wie oft nennen Sie 'max' in dieser Funktion im echten Code? – user3386109
Ja, es ist eine GCC-Funktion. [Verschachtelte Funktionen] (https://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html#Nested-Functions) sind nicht Standard C. Clang ist in seinem Recht zu widersprechen. Wenn Sie möchten, dass Ihr Code portabel ist, tun Sie es nicht. –
Und 'inline' macht hier keinen Sinn. Es ist ein wertvolles Werkzeug, wenn Sie Funktionsdefinitionen in Header-Dateien platzieren möchten, so dass sie in mehreren .c-Dateien sichtbar sind. Alles, was in der gleichen .c-Datei gefunden wird, kann vom Compiler ohne Vorankündigung in den Code geschrieben werden, hier ist es einfach überflüssig. –