namespace Struktur

Hallo zusammen,

ich brauche mal wieder eure Hilfe und diesmal komme ich mit dem namespace nicht zurecht.

namespace App {
  namespace System {
    namespace Global {
      bool b;
    }
  }
}

Nun möchte ich in einer anderen Header Datei auf die variable b zugreifen.

namespace App {
  namespace System {
    void Setup() {
      Global::b = true;
    }
    
    void Loop() {
      while(true) {
        
      }
    }
  }
}

Doch bringt mir der Compiler immer eine Fehlermeldung

config.cpp.o:(.bss._ZN3App6System6Global1bE+0x0): multiple definition of `App::System::Global::b'
app.cpp.o:C:\Users\Caesar\AppData\Local\Temp\build1160248874098282725.tmp/app.cpp:17: first defined here
cronjob.cpp.o:C:\Users\Caesar\AppData\Local\Temp\build1160248874098282725.tmp/cronjob.cpp:17: multiple definition of `App::System::Global::b'
app.cpp.o:C:\Users\Caesar\AppData\Local\Temp\build1160248874098282725.tmp/app.cpp:17: first defined here

Kann mir jemand das genauer erklären, stimmt mein Aufbau so eigentlich?

Struktur soll so aussehen

App::System::Global::SPI::NFR24L

Mein Gedankengang SPI kann auf alles zugreifen was in namespace App Sytem und Global defeniert ist.

Bedanke mich schon im vorraus.

Vielen Dank

Grüße
Stefan

Hallo,

konnte es lösen mit HIlfe von
static bool b;

Gruß
Stefan

Hallo zusammen,

warum kann ich die Global::b in App::System::CronJob::Loop(); nicht ausgeben, es kommt immer 0 raus.

Hänge euch mal meinen Test Sketch an, wäre super wenn sich das jemand mal ansehen könnte.

Vielen Dank

Gruß
Stefan

Edit: Fehler gefunden ich kann auf eine Variable die static ist nicht direkt von außen zugreifen, mit Hilfe von der Funktion getB() bekomme ich das gewünschte Ergebnis :o)

app.cpp (468 Bytes)

app.h (246 Bytes)

config.cpp (222 Bytes)

config.h (223 Bytes)

cronjob.cpp (371 Bytes)

cronjob.h (242 Bytes)

mega_alpha_001.ino (217 Bytes)

ich kann auf eine Variable die static ist nicht direkt von außen zugreifen

Das ist ja grade der Sinn von static (in diesem Zusammenhang)

By default, an object or variable that is defined outside all blocks has static duration and external linkage. Static duration means that the object or variable is allocated when the program starts and is deallocated when the program ends. External linkage means that the name of the variable is visible from outside the file in which the variable is declared. Conversely, internal linkage means that the name is not visible outside the file in which the variable is declared.

The static keyword can be used in the following situations.
...
When you declare a variable or function at file scope (global and/or namespace scope), the static keyword specifies that the variable or function has internal linkage.
...

( Static (C++) | Microsoft Docs )

Daumen Hoch :wink:

@speedy1982: Ist dein Vorhaben theoretisch zum Üben oder willst du deinen Entwurf so umsetzen ?

Deine Fragen zum namespace finde ich absolut interessant.

Ich muß es hier schon wieder sagen, komme von Pascal/Delphi schon mit einiger Erfahrung, C++ seit ca. 1 /2 Jahren.

Die Programmstrukur von speedy1982 mit den namespaces ist im Prinzip verstanden, in meinem Pascal Augen wird das Ganze aber dadurch schwerer lesbar. (umständlicher)

Wenn man Klassen definiert, mit Konstruktor und Methoden wirkt es für mich wieder sinnvoller.

Welchen Vorteile haben die namespaces ? - bei Nutzung von Klassen.
Und ohne Klassen.
So wie bei speedy1982 Beispiel

Hallo rudirabbit,

das wird mein Grundgerüst von meinem Projekt, finde es einfach Klasse das man die Namespace überall erweitern kann, egal ob z.B. in xyl.h oder sensor.h in meinen Augen wird das alles dann flexibler?!

Ich verwende die Namespaces als Funktions Sammlungen die erweitert werden können.

Es kann dann in App::System::Loop() die Funktion App::CronJob::Loop() aufgerufen werden und dort wiederrum auf die "Variable" von App::Global::setB(); usw. mit Hilfe von using wird alles kürzer.

Denke das ist Geschmackssache, mal sehen wenn das Projekt 1000te von Zeilen hat, ob es dann noch so strukturiert wirkt.

Meine Meinung....

Gruß
Stefan