2017-01-23 1 views
2

Ich habe ein Projekt, das erfordert "Erstellen einer konstanten Variablen mit einem unbenannten Namespace", und ich muss es mit Funktionen in einer anderen CPP-Datei teilen. Es besagt, dass die Variablendeklarationen in einer eigenen Datei sein könnten. Die Verwendung des externen Schlüsselwortes wurde erwähnt, und ich fand heraus, wie man extern verwendet, die var in einer Header-Datei und like extern const char varname; deklariert, ihm einen Wert in meiner main.cpp zugewiesen, (const char varname = A; global über der Hauptfunktion) und konnte Verwenden Sie es in der anderen CPP-Datei. Aber ich bin nicht sicher, wie man einen unbenannten Namensraum benutzt. In einer Beispieldatei haben sie die folgend in der Hauptdatei:externe Konstante, unbenannter Namespace

namespace 
{ 
    extern const double time = 2.0; 
} 

Aber es gibt jetzt Beispiel dafür, wie das für den Zugriff auf in einer anderen CPP-Datei. Ich habe versucht, das mit meiner Variable zu tun, und ich bekomme einen Fehler in der anderen Datei, wo ich versuche, es zu verwenden, sagend, dass es nicht in diesem Bereich erklärt wird.

Kann mir jemand einen Einblick geben, was ich hier tun soll, um diese beiden Dinge zu nutzen?

+5

Ich glaube nicht, dass Sie Ihre Aufgabe verstehen. Der Punkt der Verwendung von unbenanntem Namespace besteht darin, dass Funktionen und Variablen, die darin definiert sind, ** nicht ** aus anderen CPP-Dateien sichtbar sind (oder, um den richtigen Ausdruck zu verwenden, Übersetzungseinheiten). – SergeyA

+2

Der Auftrag wie gesagt scheint ein Widerspruch in sich zu sein. Die Elemente im unbenannten Namespace können nicht mit anderen Übersetzungseinheiten benannt werden. Ich nehme an, Sie könnten eine andere Datei mit '#include" otherfile.cpp "' im 'originalfile.cpp' Code" teilen ", aber das ist wirklich Betrug. –

+0

Hmm. Nun, es heißt, die Konstante mit dem unbenannten Namespace zu deklarieren, dass ich sie mit den anderen Funktionen teilen muss, und dass sie nicht als Referenz übergeben werden kann. Und es empfiehlt ausdrücklich, extern zu verwenden. Also ja, ich bin mir nicht sicher, was es will. – windy401

Antwort

1

Sie könnten versuchen, eine Accessorfunktion wie so schreiben:

main.cpp

#include "other.hpp" 

namespace 
{ 
    const double time = 2.0; 
} 

int main() 
{ 
    tellTime(); 
    return 0; 
} 

const double getTime() 
{ 
    return time; 
} 

other.hpp

#ifndef OTHER_HPP_INCLUDED 
#define OTHER_HPP_INCLUDED 

const double getTime(); 
void tellTime(); 

#endif // OTHER_HPP_INCLUDED 

other.cpp

#include <iostream> 
#include "other.hpp" 

void tellTime() 
{ 
    std::cout << "Time from the anonymous namespace of main.cpp is " << getTime() << std::endl; 
} 

Ich glaube nicht, jede Menge extern helfen: https://stackoverflow.com/a/35290352/1356754

+0

Sie müssen die 'getTime()' -Funktionsdeklaration in der 'main.cpp' nicht weiterleiten, wenn Sie sie in die Header-Datei einschließen. Es ist legal C++, aber es ist Code-Duplizierung, die im Allgemeinen vermieden werden sollte. – SebNag

1

Sie können zugreifen, um es über eine andere Referenz auf die Variable zu verwenden.

Zum Beispiel:

namespace 
{ 
    const double time = 2.0; 
    const double & local_ref_time(time); //Create a local referece to be used in this module 
} 


extern const double & global_ref_time(local_ref_time); //Create the global reference to be use from any other modules 
Verwandte Themen