2016-08-05 50 views
1

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?

+0

Wie oft nennen Sie 'max' in dieser Funktion im echten Code? – user3386109

+0

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. –

+0

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. –

Antwort

2

GCC extensions not implemented yet

Klirren nicht unterstützt nested functions; Dies ist ein komplexes Merkmal, das nur selten verwendet wird. Es ist daher unwahrscheinlich, dass es in absehbarer Zeit implementiert wird.

nur bewegen, um die max aus der Funktion und es static machen. Hier

0

, "inline" bedeutet "inline Substitution", sondern als "inline Definition".

Nach N1570:

6 eine Funktion mit einer Inline-Funktion Spezifizierer deklariert ist eine Inline- Funktion. Wenn Sie eine Funktion zu einer Inline-Funktion machen, sollten Sie die Funktion so schnell wie möglich aufrufen. 138) Der Umfang zu , die solche Vorschläge wirksam sind, ist Implementierung-definiert. 139)

138) Durch die Verwendung von, zum Beispiel, eine Alternative zu dem üblichen Funktion Aufrufmechanismus, wie beispielsweise '' inline Substitution ''. ...

Und Sie sollten keine andere Funktion in einer Funktionsdefinition definieren. Verwenden Sie auch static inline statt inline würde Ihr Leben einfacher machen.