Kako postaviti pametne telefone i računala. Informativni portal
  • Dom
  • Željezo
  • Izvorna datoteka c. Što bi trebalo biti u c-datoteci, a što u h-datoteci? Što može biti u datoteci zaglavlja

Izvorna datoteka c. Što bi trebalo biti u c-datoteci, a što u h-datoteci? Što može biti u datoteci zaglavlja

podrška.microsoft

Kada izmijenite izvorne datoteke u Visual C++ i spremite ih, retke se moraju završiti kombinacijom "CR / LF" [carriage return, line feed]. Na UNIX sustavima, linije se završavaju s "LF". Stoga, kada pregledavate datoteke koje su se promijenile u grupi Windows na UNIX sustavima, možete vidjeti mnogo znakova "^ M" u nizovima. To se događa samo kada uređivač ne zna kako protumačiti Windows datoteku. Visual C ++ može otvarati datoteke u blizini redaka koji završavaju UNIX LF stvaranjem. Ako izmijenite ovu datoteku i spremite je iz Visual C ++, ona se sprema u Windows formatu (vidjet ćete CR / LF, a ne LF koji je prethodno bio na sustavu).

Ovaj članak opisuje postupke za spremanje izmijenjene datoteke stvorene na Windows platformi u formatu koji se može koristiti na UNIX sustavima.

BILJEŠKA: Visual C ++.NET IDE sadrži funkcije dostupne za spremanje datoteke u UNIX formatu. U IDE-u spremite datoteku s Spremi kao..., odaberite Spremi s padajućeg popisa Spremi kodiranjem... i pritisnite thrn Da... Odaberite String Encoding s padajućeg popisa UNIX (LF) a zatim kliknite u redu.

Možete koristiti sljedeće korake za stvaranje projekta Win32 konzolne aplikacije koji pretvara datoteku koja sadrži "CR / LF" u završetak reda za "LF":

  1. Za stvaranje novog praznog projekta pod nazivom DOS2UNIX pomoću Win32 konzolnih aplikacija.
  2. Iz Datoteka izborniku, pritisnite tipku Novi a zatim kliknite Datoteke Tab.
  3. Molimo izaberite C / C ++ izvorna datoteka i unesite naziv nove datoteke DOS2UNIX.cpp.
  4. Zalijepite sljedeći kod u DOS2UNIX.cpp:

    #uključiti #uključiti #uključiti korištenje imenskog prostora std; int main (int argc, char * argv) (if (argc! = 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. Iz Zgrada izborniku, pritisnite tipku Stvaranje DOS2UNIX.exe za stvaranje EXE datoteke.

Možda ćete morati provjeriti ovu exe datoteku da vidite radi li ispravno. Da biste to učinili, otvorite datoteku u binarnom uređivaču Visual C ++ Prilikom odabira Otvorena u grupi Datoteka izborniku odabirom DOS2UNIX.ex, Postavka Otvori kao Kome Binarni a zatim kliknite Otvorena... Na primjer, ako datoteka sadrži "hellocrlfworld", datoteka binarnih podataka (heksadecimalna) izgledala bi ovako:

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

Ovo je ekvivalentno:

Hej
Mir

U naredbenom retku pokrenite dos2unix.exe ... Zatim otvorite datoteku u binarnom uređivaču Visual C ++. Vidjet ćete da se 0x0d uklanjaju. Dok ne izmijenite datoteku i ne spremite je u Visual C++ 0x0d s se neće pojaviti.

Ovo se može koristiti zajedno s Visual C ++ modelom automatizacije za automatizaciju cijelog procesa. Jednostavne makronaredbe skripte Microsoft Visual Basic mogu se napisati za pozivanje ovog alata, ali prvo morate dodati ovaj alat Servis meni izgleda ovako:

  1. Iz Servis izborniku, pritisnite tipku Prilagodba a zatim kliknite Servis Tab.
  2. Navedite naziv kao što je DOS2UNIX i navedite puni put do datoteke Dos2unix.exe u Tim polje za uređivanje.
  3. Postavite argument na $ (Filename) $ (FileExt).
  4. Navedite izvorni direktorij $ (WkspDir) (navedite vlastiti put).

Da biste testirali program, otvorite datoteku u uređivaču Visual C ++, a zatim iz Servis izbornik za pokretanje DOS2UNIX sredstva. Vidjet ćete da su svi CR znakovi iz datoteke otvorene u uređivaču uklonjeni.

Ako želite automatizirati ovaj proces, postupajte tako da svaki put kada spremate otvorenu datoteku u uređivač Visual C ++, pozove se alat DOS2UNIX.exe da ukloni 0x0d s, a zatim upotrijebi sljedeću makronaredbu VBScript:

"Ovaj događaj se pokreće svaki put kada se dokument spremi u VC ++ Editor. Sub Application_DocumentSave (theDocument)" Ovo će pozvati korisnički alat u izborniku Alati. "Promijenite broj ovisno o tome što imate. Prema zadanim postavkama samo vi" imate 6 alata u izborniku Alati, tako da će DOS2UNIX alat biti sedmi. Izvrši naredbu "UserTool7" Kraj pod

Ovaj VBScript kod će raditi samo ako imate otvorene datoteke u Visual C++ Editoru. Ovo je jedini način za pozivanje exe datoteke iz VBScript makronaredbe (VBScript makronaredbi se ne mogu proslijediti parametri). Umjesto toga možete upisati i to će biti fleksibilnije. Pozovite alat "DOS2UNIX.exe" iz dodatka bez potrebe da ga dodajete Servis izbornik.

U Visual C ++ pomoću priložene makronaredbe VBScript:

  1. Otvorite postojeću datoteku s nastavkom .dsm ili je stvorite.
  2. Zalijepite prethodno navedeni kod u datoteci.
  3. U Visual C ++ slijedite ove korake.
    1. Iz Servis izborniku, pritisnite tipku Prilagodba.
    2. Kliknite gumb Datoteke makronaredbi i dodataka Tab.
    3. Kliknite gumb Pregled preuzmite .dsm datoteku koja sadrži makronaredbu. Nakon što je .dsm datoteka odabrana u Pregled dijaloškom okviru, datoteka će se pojaviti u Dodaci i makronaredbe popis datoteka pomoću odabranog potvrdnog okvira pokraj njega.
    4. Kliknite gumb Zatvoriti nastaviti.

Sada ako otvorite datoteku u uređivaču Visual C ++ i spremite iz datoteke Datoteka izbornik koji poziva makro i svi 0x0d s bit će uklonjeni iz otvorene datoteke. Budući da će to utjecati na bilo koju datoteku koju čuvate od sada i primijeniti na bilo koji projekt koji otvorite u budućnosti, svakako onemogućite makronaredbu iz Servis izbornik pomoću Prilagodba(poništite okvir pored makronaredbe).

Slično pitanje nedavno mi je postavio kolega koji počinje programirati na C jeziku. I mislio sam da je ovo dobar razlog da podijelim svoje razumijevanje ovog problema. Jer čak ni iskusni programeri nemaju uvijek ista stajališta o ovom pitanju.

Ovo je dijelom i stvar ukusa, pa koga zanima kako ja to radim, dobrodošao u mačku.

Unatoč činjenici da je "cijela istina" o h-datotekama sadržana u odgovarajućem odjeljku opisa gcc pretprocesora, dopustiti ću si neka objašnjenja i ilustracije.

Dakle, doslovno, datoteka zaglavlja (h-datoteka) je datoteka koja sadrži C deklaracije i makro definicije namijenjena upotrebi u nekoliko izvornih datoteka (c-datoteke). Ilustrirajmo ovo.

Lako je vidjeti da se funkcije 1 i 2, kao i makro 2, spominju u obje datoteke. A budući da uključivanje datoteka zaglavlja daje iste rezultate kao kopiranje sadržaja u svaku C datoteku, možemo učiniti sljedeće:

Stoga smo jednostavno odabrali zajednički dio iz dvije datoteke i smjestili ga u datoteku zaglavlja.
Ali je li datoteka zaglavlja u ovom slučaju sučelje?

  • Ako trebamo koristiti funkcionalnost koju funkcije 1 i 2 implementiraju negdje drugdje, onda Da
  • Ako je makronaredba 2 namijenjena samo za korištenje u datotekama Unit1.c i Unit2.c, tada nema mjesta u datoteci sučelja
Štoviše, trebamo li doista imati dvije C datoteke za implementaciju sučelja definiranog u zaglavlju? Ili je jedan dovoljan?
Odgovor na ovo pitanje ovisi o detaljima implementacije funkcija sučelja i o tome gdje su implementirane. Na primjer, ako dijagrame učinite detaljnijim, možete zamisliti varijantu kada se funkcije sučelja implementiraju u različite datoteke:


Ova implementacija dovodi do visoke kohezije koda, niske mogućnosti testiranja i poteškoća u ponovnoj upotrebi takvih modula.
Kako ne bih imao takvih poteškoća, C-datoteku i datoteku zaglavlja uvijek smatram jednim modulom. U kojem,
  • datoteka zaglavlja sadrži samo one deklaracije funkcija, tipova, makronaredbi koje su dio sučelja ovog modula.
  • C-datoteka, zauzvrat, mora sadržavati implementaciju svih funkcija deklariranih u h-datoteci, kao i privatne tipove, makronaredbe i funkcije koje su potrebne za implementaciju sučelja.
Dakle, da sam slučajno implementirao kod koji odgovara dijagramu iznad, pokušao bih postići sljedeće (završeci _s i _h u nazivima datoteka dodani su zbog nemogućnosti korištenja točke u alatu koji sam koristio izraditi dijagrame):


Dijagram pokazuje da zapravo imamo posla s dva nezavisna modula, od kojih svaki ima svoje sučelje u obliku datoteke zaglavlja. To omogućuje korištenje samo sučelja koje je stvarno potrebno u ovom konkretnom slučaju, a ovi moduli se mogu testirati neovisno jedan o drugom.
Čitatelj je možda primijetio da se makro 2 iz datoteke zaglavlja ponovno vratio kao kopija u obje C-datoteke. Naravno, ovo nije baš zgodno za održavanje. No, također nije ispravno napraviti ovaj makro dio sučelja.
U takvim slučajevima radije napravim zasebnu datoteku zaglavlja koja sadrži vrste i makronaredbe potrebne za više C datoteka.

Nadam se da sam uspio identificirati one entitete koje je potrebno smjestiti u datoteke zaglavlja. Također, da se pokaže razlika između sučelja i datoteka koje sadrže deklaracije i makronaredbe koje zahtijeva nekoliko C-datoteka.

Hvala vam na pažnji prema materijalu.

Programiranje Kozlova Irina Sergejevna

27. C ++ izvorne datoteke

27. C ++ izvorne datoteke

C++ program najčešće uključuje veliki broj izvornih datoteka, od kojih svaka sadrži opise tipova, funkcija, varijabli i konstanti. Da bi se ime koristilo u različitim izvornim datotekama da se odnosi na određeni objekt, mora biti opisano kao vanjsko. Na primjer:

vanjski dvostruki sqrt (dvostruki); vanjski instream cin;

Najlakši način da se osigura konzistentnost izvornih datoteka je da iste opise smjestite u zasebne datoteke koje se nazivaju datoteke zaglavlja (ili zaglavlja), a zatim uključite, odnosno kopirate, ove datoteke zaglavlja u sve datoteke gdje su ti opisi potrebni. Na primjer, ako se sqrt opis nalazi u datoteci zaglavlja za standardne matematičke funkcije math.h i trebate izdvojiti kvadratni korijen od 4, trebali biste koristiti program:

Budući da se obične datoteke zaglavlja sastoje od velikog broja izvornih datoteka, ne sadrže opise koji se ne bi trebali ponavljati.

U naredbi uključivanja, naziv datoteke koji je u kutnim zagradama, na primjer, odnosi se na datoteku tog naziva u standardnom direktoriju (obično / usr / include / CC); datoteke pohranjene negdje drugdje upućuju se pomoću imena zatvorenih u dvostrukim navodnicima. Na primjer:

#include "math1.h" #include "/usr/bs/math2.h"

uključit će math1.h iz imenika trenutnog korisnika i math2.h iz / usr / bs.

Pokažimo kako bismo mogli definirati vrstu izlaznog toka ostreama. Da stvari budu jednostavne, pretpostavimo da je tip međuspremnika streambuf. Tip streambuf definiran je na istom mjestu kao i stvarna definicija ostreama. Vrijednost korisnički definiranog tipa specificira podatke koji su potrebni za predstavljanje objekta tog tipa i veliki broj operacija za rad na tim objektima. Definicija se sastoji od dva dijela: privatnog dijela, koji sadrži informacije koje koristi samo njegov programer, i javnog dijela, koji je sučelje tipa s korisnikom.

Iz knjige Windows programi i datoteke autor Klimov A

DBX datoteke DBX datoteke pohranjuju Outlook Express zapise. Ove datoteke, koje se nazivaju banka poruka, sadrže slova, poruke grupa za vijesti itd. Ako želite, možete kopirati ove datoteke na medij za pohranu kako biste ih prenijeli na drugo računalo.

Iz knjige Programiranje Autor Kozlova Irina Sergejevna

INF datoteke U ovom članku ćemo pogledati što je INF datoteka, kako je koristiti za rad s drugim datotekama i registrom, kreiranje prečaca, pokretanje programa itd. Kao što znate, manje-više ozbiljan softverski proizvod obično zahtijeva poseban

Iz knjige Win2K FAQ (v. 6.0) autor Shashkov Alexey

12. Komentari. Izvorne datoteke Komentar je skup znakova koje prevodilac zanemaruje. Ali ovaj skup znakova podliježe određenim ograničenjima. Unutar skupa znakova koji predstavljaju komentar ne smije biti posebnih znakova

Iz knjige Microsoft Visual C ++ i MFC. Programiranje za Windows 95 i Windows NT Autor Frolov Aleksandar Vjačeslavovič

27. C ++ izvorne datoteke C ++ program najčešće uključuje veliki broj izvornih datoteka od kojih svaka sadrži opise tipova, funkcija, varijabli i konstanti. Tako da se naziv može koristiti u različitim izvornim datotekama za upućivanje na određeni objekt, jest

Iz knjige UNIX: Procesna komunikacija Autor Stevens William Richard

Datoteke Prema popularnom zahtjevu, otvorite odjeljak s korisnim datotekama za W2k. Odjeljak se sastoji od dva dijela, prvi su službene zakrpe od Microsofta (ne sve, već samo one koje nam se čine najvažnijima), a drugi dio, koji će uključivati ​​sve datoteke spomenute u FAQ, samo uslužne programe,

Iz knjige Programski jezik C za osobno računalo autor Bochkov S.O.

Iz knjige KOMPAS-3D za studente i školarce. Crtanje, informatika, geometrija Autor Bolshakov Vladimir

Iz knjige Nedokumentirane i malo poznate značajke sustava Windows XP Autor Klimenko Roman Aleksandrovič

Izvorne datoteke Tekst C programa može se podijeliti na nekoliko izvornih datoteka. Izvorna datoteka je tekstualna datoteka koja sadrži cijeli program ili njegov dio. Prilikom sastavljanja izvornog programa, svaka od njegovih sastavnih izvornih datoteka

Iz knjige Programiranje za Linux. Profesionalni pristup autor Mitchell Mark

Dodatak 2 Početni podaci za solidno modeliranje

Iz UNIX knjige: Razvoj umreženih aplikacija Autor Stevens William Richard

Dodatak 3 Početni podaci za obiteljsko modeliranje

Iz knjige Wiki-Government [Kako tehnologija može učiniti moć boljom, demokraciju jačom, građane moćnijim] autor Novek Bet

CPL datoteke Iz prethodnih nekoliko paragrafa naučili ste gotovo sve teorijske izračune potrebne za rad s programom rundll32.exe. Sada će biti navedene mogućnosti koje ovaj program može pružiti korisniku. Počnimo s opisom

Iz knjige UNIX - Univerzalno programsko okruženje od Pike Roba

1.5.4. Linux izvor je otvorenog koda, zar ne? Glavni sudac koji određuje kako sustav funkcionira je izvorni kod samog sustava. Na našu sreću, dostupan je besplatno. Postojeća distribucija Linuxa može uključivati ​​izvorni kod za cijeli sustav i sve

Iz knjige autora

A.3.5. Izvorni kod programa kalkulatora Listing A.3 prikazuje tekst programa koji izračunava vrijednosti postfiksnih izraza. Listing A.3. (kalkulator.c) Glavni dio programa kalkulatora / * Izračuni u unarnom formatu. * // * Jednoredni unos u program

Iz knjige autora

Dodatak D Različiti izvorni kodovi D.1. Datoteka zaglavlja unp.h Gotovo svaki program u ovoj knjizi počinje uključivanjem datoteke zaglavlja unp.h, prikazanog u Listingu D.1. Ova datoteka uključuje sve standardne datoteke zaglavlja sustava potrebne za rad.

Iz knjige autora

Iz knjige autora

Dodatak 3 Izvorni tekstovi hoc kalkulatora Ove datoteke sadrže sav kod iz "Programskog okruženja Unixa", Briana Kernighana i Roba Pikea (Prentice Hall, 1984., ISBN 0-13-937681-X). Zasebna hoc6 distribucija sadrži sve popravke koje smo na to primijenili; verzija u ovoj datoteci je iz knjige Autorsko pravo © Lucent Technologies, 1997. Sva prava pridržana Dozvola za korištenje, kopiranje, modificiranje i distribuciju ovog softvera i njegove dokumentacije za



Ako se pravilno koristi, ovo može biti korisna tehnika.

Pretpostavimo da imate složen podsustav kritičan za misiju s prilično malim javnim sučeljem i puno neimplementiranog implementacionog koda. Kod pokreće do nekoliko tisuća redaka, stotine privatnih funkcija i dosta privatnih podataka. Ako radite s netrivijalnim ugrađenim sustavima, vjerojatno se često suočavate s ovom situacijom.

Vaše rješenje će vjerojatno biti slojevito, modularno i odvojeno, a ti aspekti se mogu prikladno predstaviti i poboljšati kodiranjem različitih dijelova podsustava u različitim datotekama.

S C-om možete izgubiti puno. Gotovo svi alati pružaju pristojne optimizacije za jednu jedinicu kompilacije, ali su vrlo pesimistični u pogledu svega što je eksterno deklarirano.

Ako sve stavite u jedan originalni C modul, dobit ćete -

    Poboljšanja performansi i veličine koda - U mnogim slučajevima, pozivi funkcija bit će umetnuti. Čak i bez inlaya, prevodilac ima mogućnost generiranja učinkovitijeg koda.

    Podaci i funkcije na razini kanala su skriveni.

    Izbjegavanje onečišćenja prostora imena i njegovih posljedica - možete koristiti manje glomazna imena.

    Brže sastavljanje i povezivanje.

Ali također dobivate opaki nered kada je u pitanju uređivanje te datoteke i gubite impliciranu modularnost. To se može prevladati dijeljenjem izvornog koda u više datoteka i uključivanjem u jednu jedinicu kompilacije.

Međutim, morate primijeniti neke konvencije da biste to riješili. To će do neke mjere ovisiti o vašem lancu alata, ali neki opći smjernici su -

    Stavite javno sučelje u zasebnu datoteku zaglavlja - to biste ipak trebali učiniti.

    Imajte jednu glavnu .c datoteku koja uključuje sve podređene .c datoteke. Također može uključivati ​​kod za otvoreno sučelje.

    Koristite zaštitu kompajlera tako da privatna zaglavlja i izvorne jedinice ne budu uključene u vanjske jedinice kompilacije.

    Svi osobni podaci i funkcije moraju se proglasiti statičnima.

    Održavajte konceptualnu razliku između .c i .h datoteka. Koristi postojeće konvencije. Razlika je u tome što ćete u svojim naslovima imati puno statičnih oglasa.

    Osim ako vaš lanac alata ne nameće bilo kakav razlog, ne biste trebali navoditi privatne implementacijske datoteke kao .c i .h. Ako koristite uključene štitnike, oni neće generirati kod i neće unijeti nova imena (kao rezultat toga, možete naići na neke prazne segmente). Velika prednost je u tome što će drugi alati (poput IDE-a) postupati s tim datotekama na odgovarajući način.

Ekstenzija datoteke je irelevantna za većinu C prevoditelja, pa će raditi.

Međutim, ovisno o postavkama vaše datoteke ili projekta, uključena c datoteka može generirati zasebnu objektnu datoteku. Kada je povezano, to može rezultirati dvostruko definiranim znakovima.

Jezik C ne zabranjuje ovu vrstu #include, ali rezultirajuća jedinica prijevoda i dalje mora biti valjana C.

Ne znam koji program koristite s .prj datotekom. Ako koristite nešto poput "make" ili Visual Studio ili bilo što drugo, samo provjerite jeste li postavili njegov popis datoteka za sastavljanje bez one koja se ne može sastaviti samostalno.

Možete ispravno uključiti .C ili .CPP datoteke u druge izvorne datoteke. Ovisno o vašem IDE-u, obično možete spriječiti dvostruko uvezivanje gledanjem svojstava izvornih datoteka koje želite uključiti, obično desnim klikom na njih i klikom na svojstva, te poništavanjem / kvačicom compile / link / exclude from assembly ili bilo koje druge opcija... može biti. Ili ne možete uključiti datoteku u sam projekt, tako da IDE niti ne zna da postoji i neće je pokušati kompajlirati. A kod make-datoteka jednostavno niste stavili datoteku u nju radi kompilacije i povezivanja.

EDIT: Oprostite, dao sam odgovor umjesto ostalih odgovora :(

Uključivanje datoteke C u drugu datoteku je legalno, ali nije preporučljivo osim ako ne znate točno zašto to činite i što pokušavate postići.
Prilično sam siguran da ćete, ako ovdje objavite razlog zašto se vaše pitanje priopćava zajednici, pronaći drugi prikladan način da postignete svoj cilj (zabilježite "gotovo" jer bi to moglo biti rješenje s obzirom na kontekst).

Inače, propustio sam drugi dio pitanja. Ako je datoteka C uključena u drugu datoteku i istovremeno uključena u projekt, vjerojatno ćete naići na problem duplih simbola, zašto će povezivanje objekata, odnosno ista funkcija biti definirana dva puta (osim ako nisu statični ).

Ovisno o vašem okruženju izrade (nećete specificirati), možda ćete otkriti da radi točno onako kako želite.

Međutim, postoje mnoga okruženja (i IDE-ovi i mnoge ručno izrađene Makefile) koje čekaju na prevođenje * .c - ako se to dogodi, vjerojatno ćete naići na pogreške povezivača zbog duplih simbola.

U pravilu, ovu praksu treba izbjegavati.

Ako apsolutno morate # uključiti izvor (i općenito ga treba izbjegavati), upotrijebite drugu datoteku za datoteku.

Ovo je u redu? da će se sastaviti

je li preporučljivo? no - .c datoteke se kompiliraju u .obj datoteke koje su povezane nakon kompilacije (od strane povezivača) u izvršnu datoteku (ili biblioteku), tako da nema potrebe za uključivanjem jedne .c datoteke u drugu. Umjesto toga, najvjerojatnije biste željeli napraviti .h datoteku koja navodi funkcije/varijable dostupne u drugoj .c datoteci i uključiti .h datoteku

Možete koristiti gcc prevodilac na linuxu da povežete dvije datoteke s jednim izlazom. Pretpostavimo da imate dvije c datoteke, jedna je "main.c", a druga je "support.c". Dakle, naredba za povezivanje ovo dvoje

Gcc main.c support.c -o main.out

Ove dvije datoteke bit će povezane s istim izlazom main.out. Za pokretanje izlaza, naredba bi bila

./main.out

Ako koristite funkciju main.c koja je deklarirana u datoteci support.c, tada je morate deklarirati u osnovi koristeći klasu extern pohrane.

Vrhunski povezani članci