Online, συμπεριλαμβανομένου ενός αρχείου πηγής C σε ένα άλλο; Μετάφραση, συμπεριλαμβανομένου ενός αρχείου πηγής, σε άλλο; Τι θα μπορούσε να βρίσκεται στο αρχείο εφαρμογής

Αυτό το είδος ερώτησης που ζήτησα πρόσφατα έναν συνάδελφο, αρχίζοντας να προγραμματίζετε στο SI. Και σκέφτηκα ότι ήταν ένας καλός λόγος να μοιραστώ την κατανόησή μου για αυτό το ζήτημα. Επειδή ακόμη και οι έμπειροι προγραμματιστές δεν έχουν πάντα παρόμοιες απόψεις σχετικά με αυτό.

Εν μέρει αυτό είναι θέμα γεύσης, έτσι ποιος ενδιαφέρεται να κάνω, καλωσορίζω στη γάτα.

Παρά το γεγονός ότι "ολόκληρη η αλήθεια" σχετικά με τα αρχεία H περιέχεται στο κατάλληλο τμήμα της περιγραφής του προεπεξεργαστή της GCC, επιτρέπουν την ίδια κάποιες εξηγήσεις και εικονογραφήσεις.

Έτσι, εάν ένα κυριολεκτικά, το αρχείο κεφαλίδας (αρχείο H) είναι ένα αρχείο που περιέχει μια δήλωση και ο ορισμός μακροεντολής που προορίζεται για χρήση σε διάφορα αρχεία πηγής (αρχεία C). Το απεικονάσουμε.

Είναι εύκολο να παρατηρήσετε ότι οι λειτουργίες 1 και 2, καθώς και η μακροεντολή 2, αναφέρονται και στα δύο αρχεία. Και επειδή, η συμπερίληψη των αρχείων κεφαλίδας οδηγεί στα ίδια αποτελέσματα με την αντιγραφή των περιεχομένων σε κάθε αρχείο SI, μπορούμε να κάνουμε τα εξής:

Με αυτόν τον τρόπο, απλώς διαθέσαμε ένα κοινό μέρος δύο αρχείων και το τοποθετήσαμε στο αρχείο κεφαλίδας.
Αλλά είναι το αρχείο κεφαλίδας με τη διεπαφή σε αυτή την περίπτωση;

  • Εάν χρειαστεί να χρησιμοποιήσουμε τη λειτουργικότητα που λειτουργούν 1 και 2 εφαρμόζονται κάπου αλλού, τότε ναι
  • Εάν η μακροεντολή 2 προορίζεται μόνο για χρήση σε αρχεία UNIT1.C και UNIT2.C, τότε δεν τοποθετεί το αρχείο διασύνδεσης
Επιπλέον, πρέπει πραγματικά να έχουμε δύο αρχεία SI για να εφαρμόσουμε τη διεπαφή που ορίζεται στο αρχείο κεφαλίδας; Ή είναι ένα;
Η απάντηση σε αυτή την ερώτηση εξαρτάται από τις λεπτομέρειες της εφαρμογής των λειτουργιών διεπαφής και από τον τόπο εφαρμογής τους. Για παράδειγμα, εάν κάνετε διαγράμματα πιο λεπτομερή, μπορείτε να υποβάλετε μια επιλογή όταν οι λειτουργίες διασύνδεσης υλοποιούνται σε διαφορετικά αρχεία:


Αυτή η ενσωμάτωση οδηγεί σε υψηλούς κωδικούς, χαμηλές δοκιμές και πολυπλοκότητα Επαναχρησιμοποίηση τέτοιες μονάδες.
Για να μην έχετε τέτοιες δυσκολίες, θεωρώ πάντα ένα αρχείο C και ένα αρχείο κεφαλίδας ως μία μονάδα. Στο οποίο,
  • Το αρχείο κεφαλίδας περιέχει μόνο τις δηλώσεις λειτουργιών, τύπων, μακροεντολών που αποτελούν μέρος της διασύνδεσης αυτής της ενότητας.
  • Το αρχείο C, με τη σειρά του, πρέπει να περιέχει την εφαρμογή όλων των λειτουργιών που δηλώνεται στο αρχείο H, καθώς και τους ιδιωτικούς τύπους, τις μακροεντολές και τις λειτουργίες που απαιτούνται για την εφαρμογή της διασύνδεσης.
Έτσι, αν είχα την ευκαιρία να εφαρμόσω τον κώδικα που εφαρμόστηκε το διάγραμμα παραπάνω, θα προσπαθούσα να επιτύχω τα ακόλουθα (τέλος του _C και _h στα ονόματα αρχείων που προστέθηκαν λόγω της αδυναμίας χρήσης του σημείου που χρησιμοποίησα Δημιουργία διαγραμμάτων):


Το διάγραμμα δείχνει ότι στην πραγματικότητα έχουμε να κάνουμε με δύο ανεξάρτητες μονάδες, καθένα από τα οποία έχει τη δική του διεπαφή με τη μορφή ενός αρχείου κεφαλίδας. Αυτό καθιστά δυνατή τη χρήση μόνο αυτής της διεπαφής που είναι πραγματικά απαραίτητη σε αυτή τη συγκεκριμένη περίπτωση. Επιπλέον, αυτές οι μονάδες μπορούν να δοκιμαστούν ανεξάρτητα το ένα από το άλλο.
Ο αναγνώστης, πιθανώς, παρατήρησε ότι η μακροεντολή 2 από το αρχείο κεφαλίδας επέστρεψε και πάλι ως ένα αντίγραφο και στα αρχεία SI. Φυσικά, δεν είναι πολύ βολικό να υποστηρίξουμε. Αλλά και για να γίνει αυτό το μακροεντολικό μέρος της διεπαφής δεν είναι σωστό.
Σε τέτοιες περιπτώσεις, προτιμώ να κάνω ένα ξεχωριστό αρχείο κεφαλίδας που περιέχει τύπους και μακροεντολές που απαιτούνται από πολλά αρχεία SI.

Ελπίζω ότι κατάφερα να εντοπίσω αυτές τις οντότητες που πρέπει να τοποθετηθούν σε αρχεία κεφαλίδας. Εκτός από, δείχνουν τη διαφορά μεταξύ διεπαφών και αρχείων που περιέχουν δηλώσεις και μακροεντολές που απαιτούνται από πολλά αρχεία SI.

Σας ευχαριστούμε για την προσοχή σας στο υλικό.

Υποστήριξη.Microsoft.

Κατά την αλλαγή των αρχείων προέλευσης στο Visual C ++ και αποθηκεύστε τα, οι χορδές πρέπει να ολοκληρώσουν τους χαρακτήρες "CR / LF" [το σύμβολο επιστροφής φορέα, τη μετάφραση σειράς]. Στα συστήματα Unix, οι χορδές ολοκληρώνονται χρησιμοποιώντας το "LF". Έτσι, κατά την προβολή των αρχείων που έχουν αλλάξει στην ομάδα των Windows σε συστήματα UNIX, οι χαρακτήρες που έχουν ρυθμιστεί "^ m" μπορούν να εμφανιστούν σε γραμμές. Αυτό συμβαίνει μόνο όταν χρησιμοποιείτε τον επεξεργαστή δεν ξέρει πώς να ερμηνεύσει Αρχείο Windows.. Visual C ++ Μπορείτε να ανοίξετε αρχεία, σε χορδές που τελειώνουν με τη δημιουργία του Unix LF. Εάν αλλάξετε αυτό το αρχείο και αποθηκεύστε το από το Visual C ++, και στη συνέχεια αποθηκεύεται μέσα Μορφή των Windows (Θα δείτε το CR / LF και όχι το LF, το οποίο ήταν στο παρελθόν στο σύστημα).

Αυτό το άρθρο περιγράφει τις διαδικασίες για την αποθήκευση του αλλαγμένου αρχείου που δημιουργήθηκε στην πλατφόρμα των Windows σε μορφή που μπορεί να χρησιμοποιηθεί σε συστήματα UNIX.

ΣΗΜΕΙΩΣΗ: Visual C ++. Το NET IDE περιέχει λειτουργίες διαθέσιμες για να αποθηκεύσετε το αρχείο σε μορφή Unix. Σε ένα ολοκληρωμένο περιβάλλον ανάπτυξης, αποθηκεύστε το αρχείο χρησιμοποιώντας Αποθήκευση ως..., επιλέξτε Αποθήκευση από την αναπτυσσόμενη λίστα Αποθηκεύστε με την κωδικοποίηση ...και κάντε κλικ στο κουμπί Thrn Ναί. Επιλέξτε από την αναπτυσσόμενη λίστα τη γραμμή που κωδικοποιεί Unix (LF)και στη συνέχεια κάντε κλικ στο Εντάξει.

Μπορεί να χρησιμοποιηθεί επόμενα βήματα Για να δημιουργήσετε μια εφαρμογή Console Win32, ένα έργο που μετατρέπει ένα αρχείο που περιέχει το "CR / LF" για να ολοκληρώσει τη συμβολοσειρά για "LF":

  1. Για να δημιουργήσετε ένα νέο κενό έργο Win32 με το όνομα Dos2unix χρησιμοποιώντας τις εφαρμογές κονσόλας Win32.
  2. Του Αρχείο Μενού, κάντε κλικ στην επιλογή Νέοςκαι στη συνέχεια κάντε κλικ στο Αρχεία Αυτί.
  3. Επιλέγω Αρχικό αρχείο C / C ++ Και εισάγετε το όνομα του νέου αρχείου Dos2unix.cpp.
  4. Εισαγάγετε τον ακόλουθο κώδικα στο Dos2unix.cpp:

    #Περιλαμβάνω. #Περιλαμβάνω. #Περιλαμβάνω. Χρησιμοποιώντας το Namespace STD. Int Main (Int Argc, Char * ARGV) (αν (ARGC! \u003d 2) (Cout<< "Please specify: dos2unix filename" << endl; return 0; } char ch; char temp="\0"; //Open the file for reading in binarymode. ifstream fp_read(argv, ios_base::in \ / ios_base::binary); sprintf(temp, "%s.temp", argv); //Create a temporary file for writing in the binary mode. This //file will be created in the same directory as the input file. ofstream fp_write(temp, ios_base::out \ / ios_base::trunc \ / ios_base::binary); while(fp_read.eof() != true) { fp_read.get(ch); //Check for CR (carriage return) if((int)ch == 0x0D) continue; if (!fp_read.eof())fp_write.put(ch); } fp_read.close(); fp_write.close(); //Delete the existing input file. remove(argv); //Rename the temporary file to the input file. rename(temp, argv); //Delete the temporary file. remove(temp); return 0; }

  5. Του Κτίριο Μενού, κάντε κλικ στην επιλογή Δημιουργία dos2unix.exe. Για να δημιουργήσετε ένα αρχείο exe.

Μπορεί να χρειαστεί να ελέγξετε αυτό το αρχείο exe για να δείτε αν λειτουργεί σωστά. Για να το κάνετε αυτό, ανοίξτε το αρχείο στον Visual C ++ δυαδικό επεξεργαστή κατά την επιλογή Ανοιξε σε μια ομάδα Αρχείο Μενού επιλέγοντας dos2unix.ex, ρύθμιση Ανοίγω ως Κ Δυάδικοςκαι στη συνέχεια κάνοντας κλικ Ανοιξε. Για παράδειγμα, εάν το αρχείο περιέχει "HelloCrlfworld", τα δυαδικά δεδομένα αρχείων (δεκαεξαδικά) θα μοιάζουν με αυτό:

48 65 6 C 6 C 6F 0 D 0A 57 6F 72 6 C 64

Αυτό ισοδυναμεί με:

γεια
Ειρήνη

Στη γραμμή εντολών, εκτελέστε την εντολή dos2unix.exe . Στη συνέχεια, ανοίξτε το αρχείο στον Visual C ++ Binary Editor. Θα δείτε ότι το 0x0d s διαγράφεται. Μέχρι να αλλάξετε το αρχείο και να το αποθηκεύσετε στο Visual C ++ 0x0d s δεν θα εμφανιστεί.

Αυτό μπορεί να χρησιμοποιηθεί σε συνδυασμό με το μοντέλο αυτοματοποίησης Visual C ++ αυτοματοποιήστε ολόκληρη τη διαδικασία. Το απλό σενάριο μακροεντολών της Microsoft Visual Basic μπορεί να γραφτεί για να καλέσει αυτό το ταμείο, αλλά πρώτα πρέπει να προσθέσετε Υπηρεσία Το μενού έχει ως εξής:

  1. Του Υπηρεσία Μενού, κάντε κλικ στην επιλογή Σύνθεσηκαι στη συνέχεια κάντε κλικ στο Υπηρεσία Αυτί.
  2. Καθορίστε το όνομα, όπως το Dos2unix και καθορίστε την πλήρη διαδρομή στο αρχείο Dos2unix.exe στο Ομάδα Πεδίο επεξεργασίας.
  3. Ορίστε για το επιχείρημα, $ (fileame) $ (fileext).
  4. Καθορίστε τον κατάλογο προέλευσης $ (Wkspdir) (καθορίστε τη δική σας διαδρομή).

Για να ελέγξετε το πρόγραμμα, ανοίξτε το αρχείο στον Επεξεργαστή Visual C ++ και στη συνέχεια από Υπηρεσία Μενού εκκίνησης Dos2unix που σημαίνει. Θα δείτε ότι όλοι οι χαρακτήρες της CR διαγράφηκαν στον επεξεργαστή.

Αν χρειαστεί να αυτοματοποιήσετε αυτή τη διαδικασία για να επεξεργαστείτε με τέτοιο τρόπο ώστε κάθε φορά που αποθηκεύετε το ανοιχτό αρχείο στον οπτικό επεξεργαστή C ++, το εργαλείο Dos2unix.exe καλείται να καταργήσει το 0x0d s και στη συνέχεια να χρησιμοποιήσει την ακόλουθη μακροεντολή VBScript:

"Αυτό το έγγραφο εκτοξεύεται κάθε φορά που το έγγραφο αποθηκεύεται στον επεξεργαστή VC ++. Sub application_documentsave (Thedocument)" Αυτό θα καλέσει το εργαλείο χρήστη στο μενού Εργαλεία. Msgstr "Αλλαγή του αριθμού ανάλογα με το τι έχετε. Από προεπιλογή μόνο" έχετε 6 εργαλεία κάτω από το μενού Εργαλεία, έτσι ώστε το εργαλείο Dos2unix να είναι το 7ο. ExecuteCommand "USERTOOL7"

Αυτός ο κωδικός VBScript θα λειτουργήσει μόνο εάν έχετε ανοίξει αρχεία στον οπτικό επεξεργαστή C ++. Αυτός είναι ο μόνος τρόπος για να καλέσετε ένα αρχείο exe από μια μακροεντολή VBScript (η μακροεντολή VBScript δεν μπορεί να μεταφερθεί στις παραμέτρους). Μπορείτε να γράψετε αντ 'αυτού και θα είναι πιο ευέλικτο. Καλέστε το εργαλείο "dos2unix.exe" από το πρόσθετο χωρίς να χρειάζεται να το προσθέσετε Υπηρεσία μενού.

Στο Visual C ++ χρησιμοποιώντας τις μακροεντολές που παρέχονται από το VBScript:

  1. Ανοίξτε ένα υπάρχον αρχείο με επέκταση.DDSM ή δημιουργήστε ένα.
  2. Τοποθετήστε τον κωδικό που εμφανίζεται προηγουμένως στο αρχείο.
  3. Στο Visual C ++, ακολουθήστε τα εξής βήματα.
    1. Του Υπηρεσία Μενού, κάντε κλικ στην επιλογή Σύνθεση.
    2. πάτα το κουμπί Αρχεία μακροεντολών και πρόσθετα Αυτί.
    3. πάτα το κουμπί ΣΦΑΙΡΙΚΗ ΕΙΚΟΝΑ Κατεβάστε το αρχείο.dsm που περιέχει μακρο. Μία φορά στο αρχείο.Dsm επιλέχθηκε μέσα ΣΦΑΙΡΙΚΗ ΕΙΚΟΝΑΠαράθυρο διαλόγου, το αρχείο θα εμφανιστεί στο Συμπληρώματα και μακροεντολές Κατάλογος αρχείων χρησιμοποιώντας το επιλεγμένο πλαίσιο ελέγχου δίπλα του.
    4. πάτα το κουμπί Κλείσε να συνεχίσει.

Τώρα, αν ανοίξετε το αρχείο στον Επεξεργαστή Visual C ++ και αποθηκεύστε από το αρχείο Αρχείο Το μενού που ονομάζεται Macro και όλα τα 0x0d s θα διαγραφεί από το ανοιχτό αρχείο. Καθώς επηρεάζει οποιοδήποτε αρχείο, αποθηκεύστε από τώρα και στο εξής και ισχύει σε οποιοδήποτε έργο για να ανοίξει στο μέλλον, βεβαιωθείτε ότι έχετε απενεργοποιήσει τη μακροεντολή Υπηρεσία Μενού με βοήθεια Σύνθεση (Καταργήστε την επιλογή του πλαισίου ελέγχου δίπλα στη μακροεντολή).



Ανάλογα με το περιβάλλον συναρμολόγησης (δεν καθορίζετε) Μπορείτε να ανιχνεύσετε ότι λειτουργεί ακριβώς όπως θέλετε.

Ωστόσο, υπάρχουν πολλά περιβάλλοντα (τόσο IDE όσο και πολλά χειροκίνητα κατεργασμένα μακιγιά), τα οποία περιμένουν τη σύνταξη * .c - Εάν συμβεί αυτό, είναι πιθανό να συναντήσετε τα σφάλματα συνδέσμων λόγω της αλληλεπικάλυψης χαρακτήρων.

Κατά κανόνα, η πρακτική αυτή πρέπει να αποφευχθεί.

Εάν πρέπει να χρειαστεί να ενεργοποιήσετε την πηγή (και συνήθως θα πρέπει να αποφεύγετε), χρησιμοποιήστε ένα άλλο αρχείο για το αρχείο.

Η ενεργοποίηση του αρχείου C σε άλλο αρχείο είναι νόμιμο, αλλά όχι κατάλληλο εάν σίγουρα δεν γνωρίζετε γιατί το κάνετε και τι προσπαθούν να επιτύχουν.
Είμαι σχεδόν σίγουρος ότι αν δημοσιεύσετε έναν λόγο εδώ, σύμφωνα με τον οποίο η ερώτησή σας θα κοινοποιηθεί στην κοινότητα, θα βρείτε έναν άλλο κατάλληλο τρόπο για να πετύχετε τον στόχο σας (προσέξτε "σχεδόν", δεδομένου ότι είναι πιθανό η παρούσα απόφαση, δεδομένου του πλαισίου).

Με την ευκαιρία, έχασα το δεύτερο μέρος της ερώτησης. Εάν το αρχείο C είναι ενεργοποιημένο σε άλλο αρχείο και ταυτόχρονα περιλαμβάνεται στο έργο, πιθανότατα θα αντιμετωπίσετε το πρόβλημα των αντιγράφων χαρακτήρων, γιατί η δέσμευση αντικειμένων, δηλαδή η ίδια λειτουργία θα οριστεί δύο φορές (αν δεν είναι στατικά ).

Η γλώσσα C δεν απαγορεύει αυτόν τον τύπο #include, αλλά η προκύπτουσα μονάδα μετάφρασης πρέπει να εξακολουθεί να είναι έγκυρη C.

Δεν ξέρω ποιο πρόγραμμα χρησιμοποιείτε το αρχείο s.prj. Εάν χρησιμοποιείτε κάτι σαν "Make" ή Visual Studio ή κάτι άλλο, βεβαιωθείτε ότι έχετε εγκαταστήσει τη λίστα των αρχείων που πρέπει να καταρτιστούν χωρίς αυτό δεν μπορεί να καταρτιστεί ανεξάρτητα.

Μπορείτε να χρησιμοποιήσετε το GCC Compiler στο Linux για να δεσμεύσετε δύο αρχεία με μία έξοδο. Ας υποθέσουμε ότι έχετε δύο αρχεία C, μία από τις οποίες είναι "main.c", και το άλλο είναι "Support.c.". Έτσι, η εντολή για τη σύνδεση αυτών των δύο

Gcc main.con support.co.con.out

Αυτά τα δύο αρχεία θα συσχετιστούν με μια έξοδο main.out. Για να ξεκινήσετε την εντολή εξόδου θα είναι

./Main.out.

Εάν χρησιμοποιείτε τη λειτουργία MAIN.C, η οποία δηλώνεται στο αρχείο Support.coc, τότε πρέπει να το δηλώσετε κυρίως και χρησιμοποιώντας την εξωτερική κλάση αποθήκευσης.

Χρησιμοποιείται σωστά, μπορεί να είναι μια χρήσιμη μέθοδος.

Ας υποθέσουμε ότι έχετε ένα περίπλοκο κρίσιμο υποσύστημα με μια μάλλον μικρή δημόσια διεπαφή και πολλή μη πραγματοποιηθείσα κώδικα εφαρμογής. Ο κώδικας λειτουργεί έως και αρκετές χιλιάδες σειρές, εκατοντάδες ιδιωτικές λειτουργίες και αρκετά ιδιωτικά δεδομένα. Εάν εργάζεστε με μη ενσωματωμένα συστήματα, πιθανότατα συχνά αντιμετωπίζετε αυτήν την κατάσταση.

Η απόφασή σας είναι πιθανό να είναι πολυεπίπεδη, αρθρωτή και απελευθέρωση και αυτές οι πτυχές μπορούν να εκπροσωπούνται και να ενισχυθούν εύκολα με την κωδικοποίηση διαφόρων τμημάτων του υποσυστήματος σε διαφορετικά αρχεία.

Με το C, μπορείτε να χάσετε πολλά κάνοντας το. Σχεδόν όλα τα εργαλεία παρέχουν αξιοπρεπή βελτιστοποίηση για μια ενιαία μονάδα συλλογής, αλλά πολύ απαισιόδηση αναφέρονται σε κάτι που δηλώνεται εξωτερικό.

Εάν βάζετε τα πάντα σε μια μονάδα πηγής c, θα πάρετε -

    Βελτίωση του κώδικα παραγωγικότητας και μεγέθους - Σε πολλές περιπτώσεις, οι κλήσεις λειτουργίας θα κατασκευαστούν. Ακόμη και χωρίς Inlay, ο μεταγλωττιστής έχει ευκαιρίες για τη δημιουργία ενός πιο αποτελεσματικού κώδικα.

    Τα δεδομένα και οι λειτουργίες του καναλιού είναι κρυμμένες.

    Αποφυγή της ρύπανσης του χώρου ονομάτων και της συνέπεμά της - μπορείτε να χρησιμοποιήσετε λιγότερα ογκώδη ονόματα.

    Ταχύτερη συλλογή και επικοινωνία.

Αλλά παίρνετε επίσης ένα κακό χάος όταν πρόκειται για την επεξεργασία αυτού του αρχείου και χάνετε την σιωπηρή διαμόρφωση. Αυτό μπορεί να ξεπεραστεί διαιρώντας τον πηγαίο κώδικα σε διάφορα αρχεία και τα μετατρέποντάς τα σε μια ενιαία μονάδα συλλογής.

Ωστόσο, πρέπει να επιβάλλετε ορισμένες συμφωνίες για να αντιμετωπίσετε αυτό. Σε κάποιο βαθμό θα εξαρτηθεί από την οργάνωση της αλυσίδας σας, αλλά ορισμένοι γενικοί δείκτες -

    Τοποθετήστε την ανοιχτή διεπαφή σε ένα ξεχωριστό αρχείο κεφαλίδας - πρέπει ακόμα να το κάνετε.

    Έχετε ένα κύριο αρχείο.C, το οποίο περιλαμβάνει όλα τα αρχεία παιδιών. Μπορεί επίσης να περιλαμβάνει τον κώδικα για την ανοικτή διεπαφή.

    Χρησιμοποιήστε τους διαδηλωτές μεταγλωττιστών, έτσι ώστε οι ιδιωτικοί τίτλοι και οι μονάδες προέλευσης να μην περιλαμβάνονται σε εξωτερικές μονάδες συλλογής.

    Όλα τα προσωπικά δεδομένα και οι λειτουργίες πρέπει να δηλωθούν στατικές.

    Διατηρήστε μια εννοιολογική διαφορά μεταξύ των αρχείων. Χρησιμοποιεί υπάρχουσες συμφωνίες. Η διαφορά είναι ότι θα έχετε πολλές στατικές διαφημίσεις στους τίτλους σας.

    Εάν η αλυσίδα εργαλείων σας δεν επιβάλλει βάσεις, δεν πρέπει να καθορίσετε αρχεία ιδιωτικής εφαρμογής ως .c I.H. Εάν χρησιμοποιείτε ενεργοποιημένους φρουρούς, δεν θα δημιουργήσουν κώδικα και δεν θα εισαγάγουν νέα ονόματα (ως αποτέλεσμα ενδέχεται να αντιμετωπίσετε ορισμένα κενά τμήματα). Ένα τεράστιο πλεονέκτημα είναι ότι άλλα εργαλεία (για παράδειγμα, IDE) θα επεξεργαστούν ανάλογα αυτά τα αρχεία.

Η επέκταση του αρχείου δεν έχει σημασία για τους περισσότερους μεταγλωττιστές C, οπότε θα λειτουργήσει.

Ωστόσο, ανάλογα με τις ρυθμίσεις του αρχείου ή του έργου σας, το αρχείο C που περιλαμβάνεται μπορεί να δημιουργήσει ένα ξεχωριστό αρχείο αντικειμένου. Όταν δεσμευτική, αυτό μπορεί να οδηγήσει σε διπλό συγκεκριμένο χαρακτήρες.

Πρέπει να προσθέσετε έναν τίτλο παρόμοιο με αυτό.

#Περιλαμβάνω.

Σημείωση: Και τα δύο αρχεία πρέπει να τοποθετούνται σε ένα μέρος.

Μπορείτε να ενεργοποιήσετε σωστά τα αρχεία. Or.cpp σε άλλα αρχεία προέλευσης. Ανάλογα με το περιβάλλον IDE, μπορείτε συνήθως να αποτρέψετε τη διπλή δέσμευση προβάλλοντας τις ιδιότητες των αρχείων προέλευσης που θέλετε να ενεργοποιήσετε, συνήθως κάνοντας δεξί κλικ πάνω τους και κάντε κλικ στις ιδιότητες και να καταργήσετε την επιλογή του πλαισίου / ελέγχου / σύνδεσης / εξαίρεση από το συναρμολόγηση ή οποιαδήποτε άλλη επιλογή. μπορεί. Ή δεν μπορείτε να ενεργοποιήσετε το αρχείο στο ίδιο το έργο, έτσι ώστε το περιβάλλον IDE να μην γνωρίζει καν ότι υπάρχει και δεν θα προσπαθήσει να το καταρτίσει. Και με τα αρχεία make, απλά δεν βάζετε το αρχείο σε αυτό για σύνταξη και διάταξη.

Επεξεργασία: Συγνώμη, έδωσα μια απάντηση αντί για μια απάντηση σε άλλες απαντήσεις :(

Αρχεία προέλευσης

Το κείμενο του προγράμματος SI μπορεί να χωριστεί σε διάφορα αρχεία προέλευσης. Το αρχείο προέλευσης είναι ένα αρχείο κειμένου που περιέχει είτε ολόκληρο το πρόγραμμα είτε το τμήμα του. Κατά την κατάρτιση του προγράμματος προέλευσης, κάθε ένα από τα συστατικά των αρχείων προέλευσης πρέπει να καταρτίζεται ξεχωριστά και στη συνέχεια να συσχετίζεται με άλλα αρχεία από τον συνδετήρα. Τα ξεχωριστά αρχεία προέλευσης μπορούν να συνδυαστούν σε ένα αρχείο προέλευσης, που θα καταρτίζονται ως ένας ενιαίος ακέραιος, μέσω της οδηγίας για το προεπεξεργαστή #Περιλαμβάνω..

Το αρχείο προέλευσης μπορεί να περιέχει οποιοδήποτε ολιστικό συνδυασμό οδηγιών, υποδεικνύοντας τον μεταγλωττιστή, τις διαφημίσεις και τους ορισμούς. Σύμφωνα με την ακεραιότητα, είναι κατανοητό ότι τέτοια αντικείμενα ως ορισμοί λειτουργιών, δομών δεδομένων ή ένα σύνολο συμβατικών οδηγιών σύνταξης πρέπει να βρίσκονται πλήρως σε ένα αρχείο, δηλ. Δεν μπορούν να ξεκινήσουν σε ένα αρχείο, αλλά να συνεχίσουν στο άλλο.

Το αρχείο προέλευσης δεν χρειάζεται να περιέχει τους εκτελεσμένους χειριστές. Μερικές φορές είναι βολικό να τοποθετήσετε μεταβλητές ορισμούς σε ένα αρχείο και σε άλλα αρχεία για να χρησιμοποιήσετε αυτές τις μεταβλητές με διαφήμιση. Στην περίπτωση αυτή, οι ορισμοί των μεταβλητών είναι εύκολα προσβάσιμοι για να αναζητήσουν και να τροποποιήσουν. Από τις ίδιες εκτιμήσεις, οι ονομαζόμενες σταθερές και οι μακρο ορισμοί συλλέγονται συνήθως σε ξεχωριστά αρχεία και τα περιλαμβάνουν μέσω οδηγίας προεπεξεργασίας. #Περιλαμβάνω. Σε αυτά τα αρχεία προέλευσης στις οποίες απαιτείται.

Ο πίνακας σημείωσης ισχύει συνήθως μόνο για μεμονωμένα τμήματα του αρχείου προέλευσης. Οι συγκεκριμένες δράσεις του μεταγλωττιστή που καθορίζονται από τις οδηγίες καθορίζονται από την ειδική εφαρμογή του μεταγλωττιστή γλωσσών SI.

Στο ακόλουθο παράδειγμα, το πρόγραμμα προέλευσης αποτελείται από δύο αρχεία πηγής. Λειτουργίες Κύριος. και Μέγιστη Που παρουσιάζονται σε ξεχωριστά αρχεία. Λειτουργία Κύριος. χρησιμοποιεί τη λειτουργία Μέγιστη στη διαδικασία εκτέλεσης.

/ * Αρχείο προέλευσης 1 - Κύριο * /

Εξωτερική int max (int, int); / * λειτουργία χαρακτηριστικών * /

Κύρια () / * Ορισμός λειτουργίας * /

int w \u003d ένα, x \u003d δύο, y \u003d τρία?

/ * Αρχείο προέλευσης 2 - Max * /

iNT MAX (A, B) / * Ορισμός λειτουργίας * /

Στην πρώτη λειτουργία του αρχείου πηγής Μέγιστη που δηλώνεται, αλλά δεν ορίζεται. Μια τέτοια λειτουργία διαφήμισης ονομάζεται προκαταρκτική. Επιτρέπει στον μεταγλωττιστή να ελέγχει την έκκληση στη λειτουργία πριν οριστεί. Ορισμός της λειτουργίας Κύριος. Περιέχει κλήσεις λειτουργιών Μέγιστη.

Σειρές που αρχίζουν με το σύμβολο # είναι οι οδηγίες του προεπεξεργαστή. Οι οδηγίες υποδεικνύουν τον προεπεξεργαστή σχετικά με την ανάγκη αντικατάστασης στο πρώτο αρχείο πηγής του ενός, δύο, τριών αναγνωριστικών στις αντίστοιχες τιμές. Η περιοχή της οδηγίας δεν ισχύει για το δεύτερο αρχείο προέλευσης.



Ψηφίστε online (8)

Η ενεργοποίηση του αρχείου C σε άλλο αρχείο είναι νόμιμο, αλλά όχι κατάλληλο εάν σίγουρα δεν γνωρίζετε γιατί το κάνετε και τι προσπαθούν να επιτύχουν.
Είμαι σχεδόν σίγουρος ότι αν δημοσιεύσετε έναν λόγο εδώ, σύμφωνα με τον οποίο η ερώτησή σας θα κοινοποιηθεί στην κοινότητα, θα βρείτε έναν άλλο κατάλληλο τρόπο για να πετύχετε τον στόχο σας (προσέξτε "σχεδόν", δεδομένου ότι είναι πιθανό η παρούσα απόφαση, δεδομένου του πλαισίου).

Με την ευκαιρία, έχασα το δεύτερο μέρος της ερώτησης. Εάν το αρχείο C είναι ενεργοποιημένο σε άλλο αρχείο και ταυτόχρονα περιλαμβάνεται στο έργο, πιθανότατα θα αντιμετωπίσετε το πρόβλημα των αντιγράφων χαρακτήρων, γιατί η δέσμευση αντικειμένων, δηλαδή η ίδια λειτουργία θα οριστεί δύο φορές (αν δεν είναι στατικά ).

Η επέκταση του αρχείου δεν έχει σημασία για τους περισσότερους μεταγλωττιστές C, οπότε θα λειτουργήσει.

Ωστόσο, ανάλογα με τις ρυθμίσεις του αρχείου ή του έργου σας, το αρχείο C που περιλαμβάνεται μπορεί να δημιουργήσει ένα ξεχωριστό αρχείο αντικειμένου. Όταν δεσμευτική, αυτό μπορεί να οδηγήσει σε διπλό συγκεκριμένο χαρακτήρες.

Ανάλογα με το περιβάλλον συναρμολόγησης (δεν καθορίζετε) Μπορείτε να ανιχνεύσετε ότι λειτουργεί ακριβώς όπως θέλετε.

Ωστόσο, υπάρχουν πολλά περιβάλλοντα (τόσο IDE όσο και πολλά χειροκίνητα κατεργασμένα μακιγιά), τα οποία περιμένουν τη σύνταξη * .c - Εάν συμβεί αυτό, είναι πιθανό να συναντήσετε τα σφάλματα συνδέσμων λόγω της αλληλεπικάλυψης χαρακτήρων.

Κατά κανόνα, η πρακτική αυτή πρέπει να αποφευχθεί.

Εάν πρέπει να χρειαστεί να ενεργοποιήσετε την πηγή (και συνήθως θα πρέπει να αποφεύγετε), χρησιμοποιήστε ένα άλλο αρχείο για το αρχείο.

Μπορείτε να χρησιμοποιήσετε το GCC Compiler στο Linux για να δεσμεύσετε δύο αρχεία με μία έξοδο. Ας υποθέσουμε ότι έχετε δύο αρχεία C, μία από τις οποίες είναι "main.c", και το άλλο είναι "Support.c.". Έτσι, η εντολή για τη σύνδεση αυτών των δύο

Gcc main.con support.co.con.out

Αυτά τα δύο αρχεία θα συσχετιστούν με μια έξοδο main.out. Για να ξεκινήσετε την εντολή εξόδου θα είναι

./Main.out.

Εάν χρησιμοποιείτε τη λειτουργία MAIN.C, η οποία δηλώνεται στο αρχείο Support.coc, τότε πρέπει να το δηλώσετε κυρίως και χρησιμοποιώντας την εξωτερική κλάση αποθήκευσης.

Νόμιζα ότι θα μοιραστώ την κατάσταση όταν η ομάδα μου αποφάσισε να ενεργοποιήσει τα αρχεία. Ο αρχιτέκτονας μας αποτελείται κυρίως από μονάδες που εξαπολύονται μέσω του συστήματος μηνυμάτων. Αυτοί οι χειριστές μηνυμάτων είναι διαθέσιμοι στο κοινό και προκαλούν πολλές τοπικές στατικές λειτουργίες λειτουργίας να εκτελέσουν το έργο τους. Το πρόβλημα προέκυψε όταν προσπαθούσα να πάρω μια επίστρωση για τις ενιαίες περιπτώσεις δοκιμών μας, δεδομένου ότι ο μόνος τρόπος για την εφαρμογή αυτού του συγκεκριμένου κώδικα υλοποίησης ήταν έμμεσα μέσω της διεπαφής γενικού μηνύματος. Με ορισμένα χαρακτηριστικά του εργαζομένου στα γόνατα στη στοίβα, αποδείχθηκε ένας εφιάλτης για να εξασφαλιστεί η σωστή επίστρωση.

Ενεργοποίηση αρχείων.C μας έδωσε την ευκαιρία να φτάσουμε στη βίδα στο αυτοκίνητο, μας ενδιαφέρει να δοκιμάσετε.

Η γλώσσα C δεν απαγορεύει αυτόν τον τύπο #include, αλλά η προκύπτουσα μονάδα μετάφρασης πρέπει να εξακολουθεί να είναι έγκυρη C.

Δεν ξέρω ποιο πρόγραμμα χρησιμοποιείτε το αρχείο s.prj. Εάν χρησιμοποιείτε κάτι σαν "Make" ή Visual Studio ή κάτι άλλο, βεβαιωθείτε ότι έχετε εγκαταστήσει τη λίστα των αρχείων που πρέπει να καταρτιστούν χωρίς αυτό δεν μπορεί να καταρτιστεί ανεξάρτητα.

Χρησιμοποιείται σωστά, μπορεί να είναι μια χρήσιμη μέθοδος.

Ας υποθέσουμε ότι έχετε ένα περίπλοκο κρίσιμο υποσύστημα με μια μάλλον μικρή δημόσια διεπαφή και πολλή μη πραγματοποιηθείσα κώδικα εφαρμογής. Ο κώδικας λειτουργεί έως και αρκετές χιλιάδες σειρές, εκατοντάδες ιδιωτικές λειτουργίες και αρκετά ιδιωτικά δεδομένα. Εάν εργάζεστε με μη ενσωματωμένα συστήματα, πιθανότατα συχνά αντιμετωπίζετε αυτήν την κατάσταση.

Η απόφασή σας είναι πιθανό να είναι πολυεπίπεδη, αρθρωτή και απελευθέρωση και αυτές οι πτυχές μπορούν να εκπροσωπούνται και να ενισχυθούν εύκολα με την κωδικοποίηση διαφόρων τμημάτων του υποσυστήματος σε διαφορετικά αρχεία.

Με το C, μπορείτε να χάσετε πολλά κάνοντας το. Σχεδόν όλα τα εργαλεία παρέχουν αξιοπρεπή βελτιστοποίηση για μια ενιαία μονάδα συλλογής, αλλά πολύ απαισιόδηση αναφέρονται σε κάτι που δηλώνεται εξωτερικό.

Εάν βάζετε τα πάντα σε μια μονάδα πηγής c, θα πάρετε -

    Βελτίωση του κώδικα παραγωγικότητας και μεγέθους - Σε πολλές περιπτώσεις, οι κλήσεις λειτουργίας θα κατασκευαστούν. Ακόμη και χωρίς Inlay, ο μεταγλωττιστής έχει ευκαιρίες για τη δημιουργία ενός πιο αποτελεσματικού κώδικα.

    Τα δεδομένα και οι λειτουργίες του καναλιού είναι κρυμμένες.

    Αποφυγή της ρύπανσης του χώρου ονομάτων και της συνέπεμά της - μπορείτε να χρησιμοποιήσετε λιγότερα ογκώδη ονόματα.

    Ταχύτερη συλλογή και επικοινωνία.

Αλλά παίρνετε επίσης ένα κακό χάος όταν πρόκειται για την επεξεργασία αυτού του αρχείου και χάνετε την σιωπηρή διαμόρφωση. Αυτό μπορεί να ξεπεραστεί διαιρώντας τον πηγαίο κώδικα σε διάφορα αρχεία και τα μετατρέποντάς τα σε μια ενιαία μονάδα συλλογής.

Ωστόσο, πρέπει να επιβάλλετε ορισμένες συμφωνίες για να αντιμετωπίσετε αυτό. Σε κάποιο βαθμό θα εξαρτηθεί από την οργάνωση της αλυσίδας σας, αλλά ορισμένοι γενικοί δείκτες -

    Τοποθετήστε την ανοιχτή διεπαφή σε ένα ξεχωριστό αρχείο κεφαλίδας - πρέπει ακόμα να το κάνετε.

    Έχετε ένα κύριο αρχείο.C, το οποίο περιλαμβάνει όλα τα αρχεία παιδιών. Μπορεί επίσης να περιλαμβάνει τον κώδικα για την ανοικτή διεπαφή.

    Χρησιμοποιήστε τους διαδηλωτές μεταγλωττιστών, έτσι ώστε οι ιδιωτικοί τίτλοι και οι μονάδες προέλευσης να μην περιλαμβάνονται σε εξωτερικές μονάδες συλλογής.

    Όλα τα προσωπικά δεδομένα και οι λειτουργίες πρέπει να δηλωθούν στατικές.

    Διατηρήστε μια εννοιολογική διαφορά μεταξύ των αρχείων. Χρησιμοποιεί υπάρχουσες συμφωνίες. Η διαφορά είναι ότι θα έχετε πολλές στατικές διαφημίσεις στους τίτλους σας.

    Εάν η αλυσίδα εργαλείων σας δεν επιβάλλει βάσεις, δεν πρέπει να καθορίσετε αρχεία ιδιωτικής εφαρμογής ως .c I.H. Εάν χρησιμοποιείτε ενεργοποιημένους φρουρούς, δεν θα δημιουργήσουν κώδικα και δεν θα εισαγάγουν νέα ονόματα (ως αποτέλεσμα ενδέχεται να αντιμετωπίσετε ορισμένα κενά τμήματα). Ένα τεράστιο πλεονέκτημα είναι ότι άλλα εργαλεία (για παράδειγμα, IDE) θα επεξεργαστούν ανάλογα αυτά τα αρχεία.

Αυτό είναι φυσιολογικό? Ναι, θα καταρτίσει

Συνιστάται; Τα αρχεία No - .c είναι καταρτίζονται στα αρχεία.BJ που είναι συνδεδεμένα μετά από σύνταξη (συνδετήρα) στο εκτελέσιμο αρχείο (ή βιβλιοθήκη), οπότε δεν υπάρχει ανάγκη να συμπεριληφθεί ένα αρχείο. Αντ 'αυτού, πιθανότατα θα θέλετε να κάνετε ένα αρχείο.h, το οποίο παραθέτει τις λειτουργίες / μεταβλητές που διατίθενται σε ένα αρχείο άλλου.C και ενεργοποιήστε το αρχείο