Dziwny problem z const

0

W pliku .cpp mam definicję:

const long int enFlag[]={// tu wartosci liczbowe
}; 

zaś w innym miejscu projektu:

extern const long int enFlag[];

Komunikat kompilatora MinGW:

undefined reference to 'enFlag'

Usunięcie słowa const w obu miejscach rozweiązuje problem, jednak nie chcę mieć tam definicji zmiennej tylko stałej. Co jest nie tak? Użycie volatile nie daje efektu.

2

Jakbyś poprawnie używała nagłówków, to nie miałabyś problemu.

// plik a.h
extern const long int enFlag[];
// plik a.cpp
#include "a.h"

const long int enFlag[]={ 1, 2, 3 };
// plik b.cpp
#include <stdio.h>
#include "a.h"

int main()
{
	printf("%d\n", enFlag[0]);
}
0

Patryk dziękuję za odpowiedź. Dodałam w generatorze konstruującym te tablice constów externa takiego samego jak w dalszej części projekt i działa poprawnie. Jednak nie spodziewałabym się w MinGW takiego błędu. Ponieważ nie pierwszy raz tak generowałam te tablice i kilka lat temu działało bez zastrzeżeń, co prawda programowałam pod mikrokontrolery i był to C nie C++.

Externa dodałam przed definicją tej tablicy, co wygląda trochę śmiesznie.

Czy mogłabym zapytać jeszcze o wyjaśnienie skąd takie działanie, na wypadek gdyby to nie był bug?

0

Ehh widać gośc od C pisze w c++ ;)
Zamiast jakiś tablic użyj enum class.
Poczytaj też o słówku constexp.
Jak nie masz kompilatora c++11 to poczytaj o zwykłym enum.

0
  1. nie gość - przeczytaj uważnie tekst. Programują nie tylko mężczyźni.
  2. nie jest to zastąpienie enum. W tej tablicy znajdują się dane, które są stałe, ale nie są to wyliczenia. stąd generowane są zewnętrznym programem.
  3. nie widzę nic złego w zastosowaniu tablicy tam gdzie nie trzeba większej funkcjonalności.

Ponawiam pytanie - dlaczego dodanie extern onst long int nazwa_stalej przed całością definicji pomogło. Chciałabym ten problem zrozumieć, a nie tylko mieć rozwiązany.

0

Generalnie chodzi o to, żeby w nagłówku można było definiować stałe, be powtarzania ich w plikach cpp.
Mechanizm ma zapobiegać błędowi: wielokrotna definicja symbolu.
Domyślnie (jeśli dobre pamiętam dla typów o trywialnym konstruktorze) const traktowane jako static const (tu static oznacza widoczne tylko w ramach translation unit).
Wówczas w każdym cpp, w którym pojawi się #include, powoduje definicję osobnej stałej o tej samej wartości.

Jeśli jednak definicja stałej jest poprzedzona jej deklaracją (extern), wszystko zaczyna działać "normalnie".
Wynika to z tego, że extern const ... zwykle pojawia się w nagłówku i wtedy kompilator wie, że nie może potraktować tej stałej jako widocznej jedynie w w bieżącym module (nie wstawia domyślnie static).

Ty w cpp zdefiniowałaś stałą (bez nagłówka), więc zadziałał mechanizm przeznaczony dla definicji stałej w nagłówku, więc symbol nie jest dostępny w innych modułach i stąd ten błąd.

0

Przywracam usunięty ponieważ reszty nie wymoderowano.post.

  1. nie gość - przeczytaj uważnie tekst. Programują nie tylko mężczyźni.
  2. nie jest to zastąpienie enum. W tej tablicy znajdują się dane, które są stałe, ale nie są to wyliczenia. stąd generowane są zewnętrznym programem.
  3. nie widzę nic złego w zastosowaniu tablicy tam gdzie nie trzeba większej funkcjonalności.

Ponawiam pytanie - dlaczego dodanie extern const long int nazwa_stalej przed całością definicji pomogło. Chciałabym ten problem zrozumieć, a nie tylko mieć rozwiązany.

0

Trolling to był z państwa strony.

Cytat:

Ada 2 dziś, 11:52

A ty że on mężczyzną? - revcorey 38 minut temu

Powyższe było tylko zwróceniem uwagi na nieposzanowanie kobiet w zawodzie. Stąd taka a nie inna forma. Do mnie zwrócono się wielokrotnie nieodpowiednio - pomimo wcześniejszych uwag i sprzeciwu na taką formę wobec mnie.

Przypomnę, że istnieje coś takiego jak zasady pożycia społecznego, w tym zwracanie się do osoby zgodnie z jej płcią - nick wpisałam damski, celowo w jednym poście wręcz nadużyłam formy żeńskiej by nie było już cienia wątpliwości z kim respondent rozmawia.

Do tego wskażę, że dobrem człowieka jest jego płeć i seksualność i nieposzanowanie tego może skończyć się postępowaniem zarówno karnym jak i cywilnym. Ale to już nie wywód dotyczący programowania, więc artykułów prawnych nie będę tu cytowała.

Niniejszym bardzo dziękuję za brak szacunku. do drugiej osoby i traktowania tej osoby jak bezpłciowego przedmiotu / konta, jakby za tym kontem nie było żywego człowieka, a jakiś bot.

revcorey 43 minuty temu
bla bla bla, ja osobiscie i 99% facetów mamy gdzieś czyjąś płeć. Szacunek zdobywa się pracą a nie tym że coś ci wisi między nogami albo nie. I dla mnie to koniec tematu.

A fotka z tematu ląduje na Wiocha.pl - bo takie rozmowy, gdy wystarczyło zwykłe przprszm tylko tam się nadaje.

Nie tak się postępuje z ludźmi. Kiedy zostanie poprawiona reszta nieprawidłowych zwrotów i kiedy pojawi się oficjalne przeprosiny od recovery?

0

@topic
wydawało mi się, że udzieliłem technicznej odpowiedzi co i jak. Poprawiłem ją jeszcze, żeby było bardziej jasne skąd to cudo.

0

MarekR22 - Tobie wybaczam, kolejnym razem patrz na Nicki. Widzę, że kobiety ogólnie słabo tu chcą przebywać, zaś po akcjach, które były prowadzone powinno być ich tu dużo. Macie nawet temat "gdzie są prograniatki". Po takim powitaniu przez kilkuletniego usera (Recovery) nie mam ochoty tu przebywać i zakładać konta a myślałam o tym.

Pozostali, którzy w d... mają to jakiej płci jestem nie przeprosili.

0
Ada 2 napisał(a):

A fotka z tematu ląduje na Wiocha.pl - bo takie rozmowy, gdy wystarczyło zwykłe przprszm tylko tam się nadaje.

OMG litości! Możesz podać linka to się ponabijamy?
Na takie tematy jest osobny dział, tam sobie możesz wojować.
Tu jest dział techniczny, wiec pisz o rzeczach TECHNICZNYCH!

2

Ada - moim zdaniem czepiasz się :)

W miejscach takich jak to, analiza heurystyczna podpowiada użytkownikom, że inni użytkownicy to na 9x% mężczyźni. Ludzie często nawet nie czytają nicków, tylko odpisują, nawiązując do przedstawionego problemu. Nie ma sensu robić co coś takiego Czwartej Wojny Punickiej :p

0

Napisz coś więcej, zrobiło się ciekawie.
Zaglądam na forum C/C++ a tam groźba procesem cywilnym.
Na wiocha.pl nie pomogli? U nas randomy nie mają za dużo szacunku, wiesz, sporo tu się ludzi przewija, bywa że z problemami natury emocjonalnej albo z brakiem identyfikacji z konkretną płcią, stąd nikt nie zwrócił uwagi jaki masz nick.

1

Powiem wam że miałem sobie dziś po pracy przyjść do domu i specjalnie poszukać w dokumentacji .itd i odpisać więcej niż o enum itd. Ale po tym festiwalu nienawiści aż szkoda czasu ale dla potomnych na początek
https://en.cppreference.com/w/cpp/keyword/extern

1

@Freja Draco, ktoś się pomylił - poprawiłam, napisałam też jednoznacznie posta w rodzaju żeńskim - zignorowano to i dalej zwracano się do mnie jak do faceta. Każdy cywilizowany człowiek w takiej sytuacji przeprosi. Tyle co do tematu. Poza tym NICK =/= NIKT. Po to się go wpisuje, że
a) warto zwrócić się nickiem, gdy nie odpowiada się na post powyżej, warto tam spojrzeć jakiej prawdopodobnie płci jest osoba - czy nie ma tam imienia? Rozumiem gdyby było tam wpisane "niedźwiedzi cołaska" - wtedy nie wiadomo.

Niestety brak jest usprawiedliwienia dla braku przeprosin i stwierdzeniu, że w d... ktoś ma jakiej jestem płci i jedzie dalej w formie męskiej.

Kolejnym razem zapytam w przyjaźniejszym miejscu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1