Wenn ich dies zu kompilieren, erhalte ich:
$ gcc foo.c
foo.c:3:5: warning: incompatible pointer to integer conversion initializing 'int' with an expression of type 'void()' [-Wint-conversion]
int i = f;
^ ~
foo.c:3:9: error: initializer element is not a compile-time constant
int i = f;
^
1 warning and 1 error generated.
Wirklich, ich glaube, dass Warnung sollte ein Fehler sein. Sie versuchen, eine Adresse in eine ganze Zahl zu setzen, und das ist in der Regel schlechte Form.
Das heißt, wenn der Compiler vorausgeht und die Konvertierung vornimmt, ist das Ergebnis keine Kompilierzeitkonstante (weil es ein konvertierter Wert ist). Also der Fehler.
Obwohl Sie nicht nach C++ fragen, war ich neugierig, wie sich die beiden Sprachen unterscheiden, also überprüfte ich, wie sich mein Compiler verhalten hat. In dieser Sprache sind beide Aufträge aus f
aus gutem Grund illegal. void*
ist kein Zeiger auf eine parameterlose Funktion, und int
ist auch nicht.
$ g++ foo.c
clang: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated
foo.c:2:7: error: cannot initialize a variable of type 'void *' with an lvalue of type 'void()'
void* v = f;
^ ~
foo.c:3:5: error: cannot initialize a variable of type 'int' with an lvalue of type 'void()'
int i = f;
^ ~
2 errors generated.
Sie können einen Elefanten nicht in ein Python-Nest stecken. BTW, Initialisierer für globale Objekte sollte konstant sein. – haccks
Wer hat Ihnen gesagt, dass Int die Adresse einer Variablen speichern kann? Mit anderen Worten: ist "sizeof (int)" gleich "sizeof (void *)"? – LPs
Warum möchten Sie es tun? Sie haben Funktionszeiger für diese – sas