2016-10-01 4 views
6

Lassen Sie uns diesen Code sehen:C Funktionsname oder Funktionszeiger?

#include <stdio.h> 

typedef int (*callback) (void *arg); 
callback world = NULL; 

int f(void *_) { 
    printf("World!"); 
    return 0; 
} 

int main() { 
    printf("Hello, "); 
    // world = f; 
    world = &f; // both works 
    if (world != NULL) { 
     world(NULL); 
    } 
} 

Wenn world variable Einstellung, beide world = f; und world = &f; funktioniert.

Welche sollte ich verwenden? Kommt es auf den Compiler oder die C-Version an?

% gcc -v 
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 
Apple LLVM version 8.0.0 (clang-800.0.38) 
Target: x86_64-apple-darwin15.6.0 
Thread model: posix 
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin 
+4

http://stackoverflow.com/questions/6293403/in-c-what-is-the-difference-between-function-and-function-when-passed-as-a – Pavel

+0

http: // Stackoverflow .com/questions/3674200/what-does-a-typedef-with-parenthesis-wie-typedef-int-fvoid-mean-is-it-a –

Antwort

2

Sowohl world = f; als auch world = &f; funktionieren, da es keinen Unterschied zwischen f und &f gibt, wenn Sie es als Argument übergeben.

Siehe C99 Spezifikation (Abschnitt 6.7.5.3.8).

Eine Deklaration eines Parameters als "Funktionsrückgabetyp" muss auf "Zeiger auf Funktionsrückgabetyp" wie in 6.3.2.1 angepasst werden.

1

Ihre Funktion f ist vom Typ int (void *_). Immer wenn f in einem Ausdruck verwendet wird, wird es implizit in einen Zeiger auf sich selbst konvertiert, der vom Typ int(*) (void *_) ist.

Welche sollte ich verwenden?

Also, für alle praktischen Zwecke der Name einer Funktion f und ein Zeiger auf die gleiche Funktion &f sind austauschbar. Siehe auch "Why do all these function pointer definitions all work? "

Kommt es auf den Compiler oder C-Version?

Nicht von einem Compiler oder C-Version abhängen.