Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Zmienne statyczne, kilka plików

Ostatnio zmodyfikowano 2016-11-11 09:38
Autor Wiadomość
bati22
Temat założony przez niniejszego użytkownika
Zmienne statyczne, kilka plików
» 2016-11-01 16:55:28
Witam
Mam dwa pliki z następującym kodem (są to listingi 9.7 i 9.8 z książki "Język C++ Szkoła programowania" Stephena Prata:
C/C++
// twofile1.cpp -- zmienne z łączeniem zewnętrznym i wewnętrznym
#include <iostream>          // przeznaczony do kompilacji z plikiem twofile2.cpp
#include "twofile2.h"
int tom = 3; // definicja zmiennej zewnętrznej
int dick = 30; // definicja zmiennej zewnętrznej
static int harry = 300; // zmienna statyczna, łączenie wewnętrzne

// prototyp funkcji
void remote_access();

int main()
{
    using namespace std;
    cout << "Funkcja main() zwraca następujące adresy:\n";
    cout << & tom << " = &tom, " << & dick << " = &dick, ";
    cout << & harry << " = &harry\n";
    remote_access();
    return 0;
}

oraz

C/C++
// twofile2.cpp -- zmienne z łączeniem zewnętrznym i wewnętrznym
#ifndef TWOFILE_H_
#define TWOFILE_H_
extern int tom; // zmienna tom zdefiniowana gdzie indziej
static int dick = 10; // przesłania zewnętrzną wersję zmiennej dick
int harry = 200; // definicja zmiennej zewnętrznej,
// bez konfliktu z wersją z pliku twofile1

void remote_access()
{
    using namespace std;
    cout << "Funkcja remote_access() zwraca następujące adresy:\n";
    cout << & tom << " = &tom, " << & dick << " = &dick, ";
    cout << & harry << " = &harry\n";
}
#endif

Błędy kompilacji dotyczą jedynie zmiennych dick i harry, gdyż następuje ich redefinicja. Jednak przecież nie powinno tak być, jeśli używam zmiennych statycznych. Dlaczego więc nie mogę mojego kodu skompilować?
P-153181
pekfos
» 2016-11-01 18:39:47
Jaki błąd?
P-153194
bati22
Temat założony przez niniejszego użytkownika
» 2016-11-01 20:10:24
D:\Materiały\C++ Szkoła programowania\Rozdzial09\twofile1.cpp|5|error: redefinition of 'int dick'|
D:\Materiały\C++ Szkoła programowania\Rozdzial09\twofile2.h|5|error: 'int dick' previously defined here|
D:\Materiały\C++ Szkoła programowania\Rozdzial09\twofile1.cpp|6|error: redefinition of 'int harry'|
D:\Materiały\C++ Szkoła programowania\Rozdzial09\twofile2.h|6|error: 'int harry' previously defined here|
||=== Build failed: 4 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
P-153203
pekfos
» 2016-11-02 00:26:59
Podaj plik .h.
P-153239
bati22
Temat założony przez niniejszego użytkownika
» 2016-11-02 07:09:00
To jest właśnie plik twofile2.h, który załączyłem w pierwszym pliku. Komentarz wskazuje, że ma rozszerzenie .cpp, ale zmieniłem je na na .h
P-153242
pekfos
» 2016-11-02 15:33:40
Nie możesz 2 razy zdefiniować zmiennej w jednej jednostce translacji.
P-153252
bati22
Temat założony przez niniejszego użytkownika
» 2016-11-05 08:27:40
Ok, ale jak używam słowa static, to nie oznacza, że definiuję zmienną tylko dla danego pliku?
P-153381
pekfos
» 2016-11-05 15:27:24
ale jak używam słowa static, to nie oznacza, że definiuję zmienną tylko dla danego pliku?
W C++ liczy się tylko podział na pliki .cpp. Kod nagłówków jest wklejany w miejsce użycia, więc w trakcie faktycznej kompilacji, nagłówki nie istnieją. Nie możesz mieć zdefiniowanych dwóch zmiennych, bo niby której należałoby użyć..? static sprawia, że nazwa zmiennej nie wystaje poza skompilowany plik .cpp, więc możesz użyć tej nazwy w innym miejscu nie powodując konfliktu.
P-153387
« 1 » 2
  Strona 1 z 2 Następna strona