Statischer und anonymer Namespace [duplizieren]

8

Ist das völlig überflüssig, oder gibt es einen Grund dafür?

%Vor%     
baruch 02.12.2012, 21:08
quelle

1 Antwort

3

Es sieht für mich redundant aus - entweder als statisch deklariert oder in einem anonymen Namespace zu sein bedeutet, dass es eine interne Verknüpfung hat.

§ 3.5 / 3:

  

Ein Name mit Namensraumbereich (3.3.6) hat eine interne Verknüpfung, wenn es der Name von: ist   - eine Variable, Funktion oder Funktionsvorlage, die explizit als statisch deklariert ist;

§ 3.5 / 4:

  

[...] Ein unbenannter Namespace oder ein Namespace, der direkt oder indirekt in einem unbenannten Namespace deklariert ist, hat eine interne Verknüpfung. [...] Ein Name mit einem Namespace-Bereich, der dies nicht hat   oben angegebene interne Verknüpfung hat die gleiche Verknüpfung wie der einschließende Namespace, wenn es der Name von
ist       - eine Variable; oder
      - eine Funktion; oder

So, wie es jetzt ist, hat es interne Verknüpfungen, weil es explizit als statisch deklariert ist. Wenn es nicht explizit als static deklariert wäre, hätte es eine interne Verknüpfung, weil es in einem unbenannten Namespace deklariert ist. Gleicher Effekt in beide Richtungen.

Beachten Sie, dass ich hier speziell auf eine Funktion antworte - es gibt einige wenige obskure Fälle, in denen es einen Unterschied gibt, wenn Sie mit dem Namen eines Typs (zB class / struct) zu tun haben / union), aber ich weiß nichts von dem, was im Falle einer Funktion zutrifft.

Was die interne Verbindung wirklich bedeutet, das ist einer dieser Orte, an dem der Standard tatsächlich ziemlich direkt und klar ist. Es ist wahrscheinlich am besten, die Definitionen aller drei Möglichkeiten (§ 3.5 / 2) zu zitieren:

  1. Wenn ein Name externe Verknüpfung hat, kann die Entität, auf die er verweist, mit Namen aus Bereichen anderer Übersetzungseinheiten oder aus anderen Bereichen derselben Übersetzungseinheit bezeichnet werden.
  2. Wenn ein Name interne Verknüpfung hat, kann die Entität, auf die er verweist, mit Namen aus anderen Bereichen in derselben Übersetzungseinheit bezeichnet werden.
  3. Wenn ein Name keine Verknüpfung hat, kann auf die Entität, auf die er verweist, nicht mit Namen aus anderen Bereichen verwiesen werden.

Beachten Sie, dass die obigen Kursivschriften mit denen im Standard übereinstimmen, was bedeutet, dass diese Sätze definieren, was diese Sätze für den Rest des Standards bedeuten.

    
Jerry Coffin 02.12.2012, 21:19
quelle

Tags und Links