Θέλω να με βοηθίσετε ξανά σε ένα θέμα πιό χειροπιαστό. Έχω ένα αρχείο .cpp που έχει μερικές μεταβλητές και ήθελα να ρωτήσω πώς μπορώ να κάνω ένα αρχείο .h (Header File) το οποίο να έχει τις μεταβλητές μέσα αλλά να μπορώ να τις χρησιμοποίησω και από το αρχείο .cpp αλλά και από μια συνάρτηση από άλλο αρχείο .h. Ξέρω ότι η περιγραφή δεν είναι και η καλήτερη απλά θέλω να κάνω κάτι τέτοιο.
Variable.h (Εδώ οι μεταβλητές)
Fun.h (Εδώ η συνάρτηση που θα χρησιμοποίσει τις μεταβλητές από το αρχείο Variable.h)
Και όλα αυτά include στο αρχείο main.cpp. (Φυσικά να μπορώ να χρησιμοποίησω τις μεταβλητές ακόμα και από το αρχείο main.cpp που κάνω include τις βιβλιοθήκες)
Δοκίμασα να βάλω μπροστά από τις μεταβλητές την δεσμευμένη λέξη 'extern'. Το είχα βρέι στο ίντερνετ αλλά δεν έκανε δεν ξέρω αν φτέει που εχώ ubuntu αν και δεν νομίζω.
Ευχαριστώ για άλλη μια φορά που έστω το διαβάσατε.
Στο ιντερνέτ δεν βρήκα κάτι της προκοπής για τα Header Files.
Εμφάνιση 1-9 από 9
-
16-01-19, 17:50 Θέλω για άλλη μια φορά τα φώτα σας ... (For Header Files) #1
-
16-01-19, 18:47 Απάντηση: Θέλω για άλλη μια φορά τα φώτα σας ... (For Header Files) #2
Στο Variable.h θα ορίσεις κανονικά τις μεταβλητές σου, π.χ.
Κώδικας:int var1; double var2;
Κώδικας:extern int var1; extern double var2;
-
16-01-19, 19:04 Απάντηση: Θέλω για άλλη μια φορά τα φώτα σας ... (For Header Files) #3
Δεν μπορώ να κάνω include στο Fun.h το αρχείο Variable.h και να τις χρησιμοποίησω απευθίας και έτσι απλά να κάνω #include <Variable.h> και να έχω τις μεταβλητές που χρειάζομε. Γίνετε με κάποιον τρόπο
Ευχαριστώ.
Π.χ
Variable.h
int x = 0;
Fun.h
#include <Variable.h>
void Fun(){
x = 3;
}
Κάτι τέτοιο έτσι το έχω στο μυαλό μου αλλά έτσι δεν γίνετε μήπως υπάρχει τρόπος να μην τις ξαναδηλώνω στο Fun.h
-
17-01-19, 13:49 Απάντηση: Θέλω για άλλη μια φορά τα φώτα σας ... (For Header Files) #4
Το variable.h το κάνεις include σε πολλά αρχεία; Τι μήνυμα λάθους παίρνεις; Μήπως "redefinition of x";
Ας δούμε κάποιες εκδοχές αυτού που έγραψες:
1)
Κώδικας:% cat fun.h #include "variable.h" void fun() { x = 3; }
Κώδικας:% cat variable.h int x = 0; % cat main.c #include <stdio.h> #include "fun.h" int main(void) { printf("x=%d\n",x); fun(); printf("x=%d\n",x); return 0; } % cc -Wall -O2 main.c && ./a.out x=0 x=3
2) Ας αλλάξουμε τώρα την main ώστε να κάνει include και το variable.h
Κώδικας:% cat main.c #include <stdio.h> #include "fun.h" #include "variable.h" int main(void) { printf("x=%d\n",x); fun(); printf("x=%d\n",x); return 0; } % cc -Wall -O2 main.c && ./a.out In file included from main.c:3: variable.h:1:5: σφάλμα: redefinition of ‘x’ int x = 0; ^ In file included from fun.h:1, from main.c:2: variable.h:1:5: σημείωση: previous definition of ‘x’ was here int x = 0; ^
Πώς μπορείς λοιπόν να το αλλάξεις αυτό ώστε να παίζει;
3)
Κώδικας:% cat variable.h int x; % cat main.c #include <stdio.h> #include "fun.h" #include "variable.h" int main(void) { x = 0; printf("x=%d\n",x); fun(); printf("x=%d\n",x); return 0; } % cc -Wall -O2 main.c && ./a.out x=0 x=3
Όταν όμως γράψεις "int x = 0;" τότε έχεις ορισμό (definition) οπότε η μεταβλητή παίρνει σάρκα και οστά ας πούμε μπακάλικα και αυτό μπορεί να γίνει μόνο μία φορά. Μαζί με τις κυκλικές αναφορές, οι πολλαπλοί ορισμοί είναι ένα από τα πιο συνήθη προβλήματα που συναντάς σε header files για αυτό είθισται να μην έχεις definitions σε header files αλλά μόνο declarations. Υπάρχουν άπειροι οδηγοί στο διαδίκτυο και απαντήσεις στο stackoverflow απλά ίσως δεν ήξερες πώς να το ψάξεις.
Επειδή όμως αφαιρέσαμε τον ορισμό από το variable.h έπρεπε να κάνουμε ακόμη μία αλλαγή που ήταν να προσθέσουμε στο main.c το "x = 0"."I like offending people, because I think people who get offended should be offended" - Linus Torvalds
"Παλιά είχαμε φτωχούς οι οποίοι ζούσανε σε φτωχογειτονιές. Τώρα, η οικονομικά δυσπραγούσα τάξη
κατέχει στέγες υποδεέστερης ποιότητας σε υποβαθμισμένα αστικά κέντρα" - George Carlin
Γα.... την πολιτική ορθότητα.
-
17-01-19, 20:31 Απάντηση: Θέλω για άλλη μια φορά τα φώτα σας ... (For Header Files) #5
Θέλω να το κάνω ναι σε πολλά αρχεία πάραδειγμα
Παράδειγμα.
Variable.h
#include <string>
using namespace std;
string x;
Fun.h
#include <Variable.h>
void fun(){
x="Hello World";
}
Print.h
#include <cstdio>
#include <iostream>
#include <Variable.h>
using namespace std;
void print(){
cout << x << endl;
}
main.cpp
#include <cstdio>
#include <iostream>
#include <Variable.h>
#include <Fun.h>
#include <Print.h>
int main(){
fun();
print();
}
(g++)
Κάτι τέτοιο. Θέλω να μπορώ να τις τραβάω από το Variable.h ...
Για να σου πώ ακριβώς τη θέλω να βάλω μέσα διότι δεν είναι και τόσο απλά αυτό που θέλω να κάνω.
1)const int
2)3x chars
3)two integers (int)
4)4x maps
5)two boolean (bool)
6)three enums
7)one ifstream...
Αύτα πάνω κάτω απλά δεν τα ανέφερα για να καταλάβω πρώτα την απλή έκδοση. Όσο για το stackoverflow μπένω κάθε μέρα είναι πολύ καλό σίτε αλλά δεν εχώ βρεί τίποτα αξιόλογο πάνω σε αυτό το θέμα και κοντά σε αυτό που θέλω... Ευχαριστώ εκτοπροτέρον που βοηθίσες!
-
17-01-19, 20:45 Απάντηση: Θέλω για άλλη μια φορά τα φώτα σας ... (For Header Files) #6
Με "extern string x" στο variable.h και προσθήκη "string x" στο main.cpp δουλεύει αλλά μάλλον δεν σε βολεύει.
"I like offending people, because I think people who get offended should be offended" - Linus Torvalds
"Παλιά είχαμε φτωχούς οι οποίοι ζούσανε σε φτωχογειτονιές. Τώρα, η οικονομικά δυσπραγούσα τάξη
κατέχει στέγες υποδεέστερης ποιότητας σε υποβαθμισμένα αστικά κέντρα" - George Carlin
Γα.... την πολιτική ορθότητα.
-
17-01-19, 20:47 Απάντηση: Θέλω για άλλη μια φορά τα φώτα σας ... (For Header Files) #7
Ναι αυτό το ξέρω αλλά δεν θέλω να ξανά δηλώνω την μεταβλητή...
Αυτός δηλαδή ο κώδικας δεν είναι σωστός έτσι;
(Variable.h
#include <string>
using namespace std;
string x;
Fun.h
#include <Variable.h>
void fun(){
x="Hello World";
}
Print.h
#include <cstdio>
#include <iostream>
#include <Variable.h>
using namespace std;
void print(){
cout << x << endl;
}
main.cpp
#include <cstdio>
#include <iostream>
#include <Variable.h>
#include <Fun.h>
#include <Print.h>
int main(){
fun();
print();
})
-
18-01-19, 20:06 Απάντηση: Θέλω για άλλη μια φορά τα φώτα σας ... (For Header Files) #8
Γιατί δεν φτιάχνεις ενα class με static τις μεταβλητές που θέλεις και στα αλλα αρχεία να το καλείς απο εκει;
Variables.h
Κώδικας:class variables{ public: static string x; }
Αναγκαστικά βάζεις το όνομα της κλάσης μπροστά, αλλα σίγουρα γίνεται πιο ευαναγνωστος ο κωδικάς σου!
-
19-01-19, 11:51 Απάντηση: Θέλω για άλλη μια φορά τα φώτα σας ... (For Header Files) #9
Εντάξη απλά μπερδέυομαι γενικότερα με τα object στην C++ τα ξερώ καλήτερα στην Java. Αλλά δεν έχει αντηκείμενα εδώ άρα...
Θα μπορούσα ομώς να κάνω και struct αλλά δεν μου βγάνει. Ευχαριστώ πάντος μάλλον έτσι θα το κάνω...
Bookmarks