C++, funkcja zewnętrzna
Ostatnio zmodyfikowano 2025-04-12 13:19
czerwonymoskit Temat założony przez niniejszego użytkownika |
C++, funkcja zewnętrzna » 2025-03-27 10:37:42 Hej Podzieliłem cały mój kod z main'a na funkcje typu void. Mam je teraz na końcu programu za zasięgiem main. Natomiast chciałbym je edytować zewnętrznie w plikach tekstowych żeby nie latać góra dół w projekcie podczas edycji tychże funkcji. Stąd moje pytanie. Jak dołączyć zewnętrznie te funkcje do programu bym mógł je wyrzucić tam gdzie teraz są czyli tuz za main'em. Czy zrobię to poprzez #include?? |
|
pekfos |
» 2025-03-27 16:53:19 |
|
czerwonymoskit Temat założony przez niniejszego użytkownika |
» 2025-04-08 14:17:36 main.cpp #include <cstdio> #include "func_zewn_test.hpp"
using namespace std;
int main() { func_zewn_test_2(); cout << endl << "ENTER..." << endl; getchar(); }
func_zewn_test.hpp #ifndef func_zewn_test #define func_zewn_test #include <iostream>
extern bool przerwa;
void func_zewn_test_2( void );
#endif
func_zewn_test.cpp #include "func_zewn_test.hpp"
bool przerwa = false;
void func_zewn_test_2( void ) { if( przerwa == false ) std::cout << "Przerwa" << std::endl; else std::cout << "Nic" << std::endl; }
Wydaje się być wszystko ok teraz. |
|
czerwonymoskit Temat założony przez niniejszego użytkownika |
» 2025-04-08 16:44:00 W takiej postaci mi to działa. |
|
pekfos |
» 2025-04-08 18:04:24 OK, ale nazwy makr normalnie chcesz mieć wielkimi literami żeby zminimalizować kolizje nazw makr z czymkolwiek innym. Pewnie taka była historia z tym że masz funkcję func_zewn_test_2() zamiast func_zewn_test(). Typową praktyką jest przerobienie nazwy pliku na nazwę makra: #ifndef FUNC_ZEWN_TEST_HPP #define FUNC_ZEWN_TEST_HPP
|
|
czerwonymoskit Temat założony przez niniejszego użytkownika |
» 2025-04-09 08:38:22 Tak zrobię. Dziękuję bardzo. Teraz mogę działać dalej 🙂 |
|
czerwonymoskit Temat założony przez niniejszego użytkownika |
» 2025-04-09 15:36:06 Mam jeszcze pytanie. Czy w pliku hpp można tworzyć zmienne? Gdy ja próbowałem tam utworzyć bool przerwa ( tym samym usuwając ja z pliku cpp) to otrzymałem komunikat o redeklaracji. Dlatego zrobiłem extern. |
|
pekfos |
» 2025-04-09 19:17:20 otrzymałem komunikat o redeklaracji. Dlatego zrobiłem extern. Bardziej precyzyjnie, błąd linkera o redefinicji zmiennej, jak sądzę. extern deklaruje zmienną, bez tego ją definiujesz. Definicja zmiennej znaczy że ma zostać przydzielona pamięć na nią, a jak zrobisz to w pliku nagłówkowym to każdy kompilowany plik cpp który dołącza ten nagłówek będzie alokować tą pamięć. Na koniec linker nie będzie wiedział co z tym zrobić, że ma pod jedną nazwą wiele obiektów do pogodzenia. Dlatego jak chcesz mieć zmienną globalną widoczną w wielu plikach, musisz ją w nagłówku zadeklarować (z extern) by kompilator o niej wiedział wszędzie, gdzie potrzebujesz jej używać, i w jednym z plików cpp mieć jej definicję. To jest klasyczny sposób robienia tego. Od C++17 możesz zdefiniować zmienną globalną jako inline: To mówi linkerowi że w przypadku wielu definicji może użyć jednej, a resztę odrzucić. Wszystkie definicje tej zmiennej muszą być identyczne i oznaczone jako inline, więc najlepiej miej coś takiego właśnie w pliku nagłówkowym. Osobiście nigdy tego nie użyłem ;) |
|
« 1 » 2 3 |