2016-07-26 27 views
2

Es scheint, dass in C++ extern (NICHT gefolgt von einer Sprache-Verknüpfung Zeichenfolge literal) keinen Unterschied auf Funktionsdeklarationen bei Namespace-Bereich (Difference between declaration of function with extern and without it). Aber hat es irgendwelche Auswirkungen auf Block-Scope-Funktionsdeklarationen? Oder ist eine lokale Funktionsdeklaration ohne extern immer gleichwertig mit einer mit extern?Unterschied zwischen local/block-scope Deklaration der Funktion mit extern und ohne es

namespace { 
    void f() { 
    extern void g(); // has external linkage 
    g(); 
    } 
    void f2() { 
    void g();  // always the same, as if, without extern 
    g(); 
    } 
} 

Vielen Dank!

+0

Warum würden Sie eine Funktion innerhalb einer Funktion deklarieren? Was denkst du tut es? –

+0

Das Gegenteil von extern ist statisch - 'static void g(); // interne Verknüpfung ". –

+0

@underscore_d check out http://stackoverflow.com/questions/1034606/is-there-any-use-for-local-function-declarations – EulersRainbow

Antwort

2

Die Regeln hier kommen wird von [ basic.link]:

Der Name einer Funktion, die im Blockbereich deklariert wurde, und der Name einer Variablen, die durch einen Blockbereich deklariert wurde extern Deklaration haben eine Verknüpfung. Wenn es eine sichtbare Deklaration einer Entität mit einer Verknüpfung mit demselben Namen und dem Typ gibt, die Entitäten ignoriert, die außerhalb des innersten umschließenden Namespacebereichs deklariert sind, deklariert die Blockbereichsdeklaration diese Entität und erhält die Verknüpfung der vorherigen Deklaration. Wenn es mehr als eine solche übereinstimmende Entität gibt, ist das Programm schlecht formatiert. Andernfalls, wenn keine übereinstimmende Entität gefunden wird, empfängt die Blockbereichseinheit externe Verknüpfung.

Es gibt also keinen Unterschied zwischen einer Blockbereich Funktionsdeklaration mit und ohne external. Aber beachten Sie das interessante Beispiel:

static void f(); 

void g() { 
    extern void f(); // internal linkage 
} 

Hier wird der Block Umfang f redeclares ::f und erhält seine gleiche Verknüpfung: intern. Auch wenn es markiert ist extern. Aber das Vorhandensein der Abwesenheit der extern Schlüsselwort ist immateriell

1

Ob eine Funktion den externen Spezifizierer hat oder nicht, sie hat eine externe Verknüpfung (wenn sie nicht explizit als interne Verknüpfung deklariert ist).

Eine lokale Funktionsdeklaration kann jedoch andere Funktionsdeklarationen mit demselben Namen im äußeren Bereich verbergen.

Betrachten Sie das folgende demonstrative Programm

#include <iostream> 

void f(int) { std::cout << "F(int)" << std::endl; } 
void f(short) { std::cout << "f(short)" << std::endl; } 

int main() 
{ 
    void f(short); 

    f(10); 

    return 0; 
} 

Sein Ausgang ist

f(short) 

Wenn die lokale Deklaration Kommentar dann die Ausgabe

F(int) 
+0

Ich denke, dass diese Antwort die Verwendung von lokalen Funktionsdeklarationen mehr hervorhebt, als zu beantworten, ob es Szenarien gibt, dass das Vorhandensein oder Fehlen von extern auf einer lokalen Funktionsdeklaration zählt? Oder fehlt mir etwas? Auch alle Verweise auf den C++ - Standard werden geschätzt. Vielen Dank! – EulersRainbow

+0

@EulersRainbow Eine lokale Deklaration kann nützlich sein, wenn es einen Konflikt zwischen Ihrer Funktionsdeklaration und einer Deklaration einer Funktion mit demselben Namen in einer Bibliothek gibt, wenn die Namensauflösung Ambiguios ist. Was den Verweis auf den Standard betrifft, habe ich leider keine Kopie des Standards oder seines Entwurfs von Hand. –

+0

Danke. Ich denke, ich verstehe ihren Nutzen - und Ihr Beispiel macht es sehr gut, den Nutzen lokaler Erklärungen hervorzuheben. Aber die Frage, die mich mehr interessiert, ist: Basierend auf dem C++ - Standard, gibt es wirklich keinen Unterschied, wenn ich 'extern' zur lokalen Funktionsdeklaration hinzufüge? – EulersRainbow