Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • Iron
  • Izvorni fajl c. Šta bi trebalo biti u c-datoteci, a šta u h-datoteci? Šta može biti u zaglavlju

Izvorni fajl c. Šta bi trebalo biti u c-datoteci, a šta u h-datoteci? Šta može biti u zaglavlju

support.microsoft

Kada modifikujete originalne fajlove u Visual C ++ i sačuvate ih, redovi se moraju završiti kombinacijom "CR / LF" [carriage return, line feed]. Na UNIX sistemima, linije se završavaju sa "LF". Stoga, kada pregledate datoteke koje su se promijenile u Windows grupi na UNIX sistemima, možete vidjeti mnogo znakova "^ M" u nizovima. Ovo se dešava samo kada uređivač ne zna kako da protumači Windows datoteku. Visual C ++ može otvoriti datoteke u blizini redova koji završavaju UNIX LF kreiranjem. Ako modifikujete ovu datoteku i sačuvate je iz Visual C ++, ona se čuva u Windows formatu (videćete CR / LF a ne LF koji je prethodno bio na sistemu).

Ovaj članak opisuje procedure za spremanje izmijenjene datoteke kreirane na Windows platformi u formatu koji se može koristiti na UNIX sistemima.

BILJEŠKA: Visual C ++ NET IDE sadrži funkcije dostupne za spremanje datoteke u UNIX formatu. U IDE, sačuvajte datoteku sa Sačuvaj kao..., izaberite sačuvaj sa padajuće liste Sačuvaj kodiranjem... i pritisnite thrn Da... Izaberite String Encoding sa padajuće liste UNIX (LF) a zatim kliknite uredu.

Možete koristiti sljedeće korake da kreirate projekt Win32 konzolne aplikacije koji pretvara datoteku koja sadrži "CR / LF" u završetak linije za "LF":

  1. Za kreiranje novog praznog projekta pod nazivom DOS2UNIX koristeći Win32 konzolne aplikacije.
  2. Od File meni, pritisnite dugme Novo a zatim kliknite Fajlovi Tab.
  3. Molimo odaberite C / C ++ izvorni fajl i unesite naziv nove datoteke DOS2UNIX.cpp.
  4. Zalijepite sljedeći kod u DOS2UNIX.cpp:

    #include #include #include korištenje imenskog prostora std; int main (int argc, char * argv) (ako (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. Od Zgrada meni, pritisnite dugme Kreiranje DOS2UNIX.exe da kreirate EXE datoteku.

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 Otvori u grupi File meni odabirom DOS2UNIX.ex, Podešavanje Otvori kao Kome Binarno a zatim kliknite Otvori... Na primjer, ako datoteka sadrži "hellocrlfworld", datoteka binarnih podataka (heksadecimalna) bi izgledala ovako:

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

Ovo je ekvivalentno:

Hej
Mir

Na komandnoj liniji pokrenite dos2unix.exe ... Zatim otvorite datoteku u binarnom uređivaču Visual C ++. Vidjet ćete da se 0x0d uklanjaju. Sve dok ne izmenite datoteku i ne sačuvate je u Visual C++ 0x0d s se neće pojaviti.

Ovo se može koristiti zajedno sa Visual C++ modelom automatizacije za automatizaciju čitavog 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. Od Servis meni, pritisnite dugme Prilagodba a zatim kliknite Servis Tab.
  2. Navedite ime kao što je DOS2UNIX i navedite punu putanju do datoteke Dos2unix.exe u Zapovjedi polje za uređivanje.
  3. Postavite argument na $ (Filename) $ (FileExt).
  4. Navedite izvorni direktorij $ (WkspDir) (navedite vlastitu putanju).

Da biste testirali program, otvorite datoteku u Visual C++ editoru, a zatim iz Servis meni za pokretanje DOS2UNIX znači. Vidjet ćete da datoteka koja je otvorena u editoru ima uklonjene sve CR znakove.

Ako trebate automatizirati ovaj proces, postupajte tako da svaki put kada snimite otvorenu datoteku u uređivač Visual C ++, alat DOS2UNIX.exe bude pozvan da ukloni 0x0d s, a zatim koristite sljedeći VBScript makro:

"Ovaj događaj se pokreće svaki put kada se dokument sačuva u VC ++ Editoru. Sub Application_DocumentSave (theDocument)" Ovo će pozvati korisnički alat u meniju Alati. "Promijenite broj u zavisnosti od toga šta imate. Podrazumevano samo" imate 6 alata u meniju Alati, tako da će DOS2UNIX alat biti 7.. ExecuteCommand "UserTool7" Kraj pod

Ovaj VBScript kod će raditi samo ako imate otvorene datoteke u Visual C++ Editoru. Ovo je jedini način da se pozove exe fajl iz VBScript makroa (VBScript makro ne može da prenese parametre). Možete upisati umjesto toga i to će biti fleksibilnije. Pozovite alat "DOS2UNIX.exe" iz programskog dodatka bez potrebe da ga dodajete Servis meni.

U Visual C++ koristeći priloženi VBScript makro:

  1. Otvorite postojeću datoteku sa ekstenzijom .dsm ili je kreirajte.
  2. Zalijepite prethodno navedeni kod u datoteci.
  3. U Visual C++ slijedite ove korake.
    1. Od Servis meni, pritisnite dugme Prilagodba.
    2. Kliknite na dugme Datoteke makroa i dodataka Tab.
    3. Kliknite na dugme Pregled preuzmite .dsm datoteku koja sadrži makro. Jednom u .dsm fajlu je odabran u Pregled dijaloškom okviru, datoteka će se pojaviti u Dodaci i makroi spisak fajlova koristeći izabrano polje za potvrdu pored njega.
    4. Kliknite na dugme Zatvori nastaviti.

Sada ako otvorite datoteku u Visual C++ editoru i spremite iz datoteke File meni koji je pozvao makro i svi 0x0d s će biti uklonjeni iz otvorene datoteke. Budući da će ovo utjecati na bilo koju datoteku koju čuvate od sada i primijeniti na bilo koji projekt koji otvorite u budućnosti, obavezno onemogućite makro iz Servis meni koristeći Prilagodba(poništite izbor u polju za potvrdu pored makroa).

Slično pitanje nedavno mi je postavio kolega koji počinje programirati na C jeziku. I smatrao sam da je ovo dobar razlog da podijelim svoje razumijevanje ovog pitanja. Jer čak ni iskusni programeri nemaju uvijek iste tačke gledišta po ovom pitanju.

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

Uprkos činjenici da je "cijela istina" o h-datotekama sadržana u odgovarajućem dijelu opisa gcc pretprocesora, dozvolit ću sebi 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-fajlovi). Hajde da to ilustrujemo.

Lako je vidjeti da se funkcije 1 i 2, kao i makro 2, spominju u oba fajla. A pošto uključivanje datoteka zaglavlja daje iste rezultate kao kopiranje sadržaja u svaki C fajl, možemo učiniti sljedeće:

Stoga smo jednostavno odabrali zajednički dio iz dva fajla i stavili ga u datoteku zaglavlja.
Ali da li je datoteka zaglavlja u ovom slučaju interfejs?

  • Ako trebamo koristiti funkcionalnost koju funkcije 1 i 2 implementiraju negdje drugdje, onda Da
  • Ako je makro 2 namijenjen samo za upotrebu u datotekama Unit1.c i Unit2.c, tada mu nema mjesta u datoteci interfejsa
Štaviše, da li zaista trebamo imati dva C fajla za implementaciju interfejsa definisanog u zaglavlju? Ili je jedan dovoljan?
Odgovor na ovo pitanje zavisi od detalja implementacije funkcija interfejsa i od toga gde 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 ponovnom korištenju takvih modula.
Da ne bih imao takvih poteškoća, C-fajl i zaglavni fajl uvek smatram jednim modulom. U kojem,
  • datoteka zaglavlja sadrži samo one deklaracije funkcija, tipova, makroa koji su dio sučelja ovog modula.
  • C-fajl, zauzvrat, mora sadržavati implementaciju svih funkcija deklariranih u h-datoteci, kao i privatne tipove, makroe i funkcije koje su potrebne za implementaciju sučelja.
Dakle, ako bih slučajno implementirao kod koji odgovara dijagramu iznad, pokušao bih postići sljedeće (završeci _s i _h u nazivima datoteka su dodati zbog nemogućnosti korištenja tačke u alatu koji sam koristio kreirajte dijagrame):


Dijagram pokazuje da zapravo imamo posla sa dva nezavisna modula, od kojih svaki ima svoj interfejs u obliku zaglavlja. Ovo omogućava da se koristi samo interfejs koji je zaista potreban u ovom konkretnom slučaju, a ovi moduli se mogu testirati nezavisno jedan od drugog.
Čitalac je možda primijetio da se makro 2 iz datoteke zaglavlja ponovo vratio kao kopija u oba C-fajla. Naravno, ovo nije baš zgodno za održavanje. Ali pravljenje ovog makro dijela interfejsa također nije ispravno.
U takvim slučajevima, radije bih napravio zasebnu datoteku zaglavlja koja sadrži tipove i makroe potrebne za više C datoteka.

Nadam se da sam uspeo da identifikujem one entitete koje je potrebno staviti u fajlove zaglavlja. Takođe, da pokaže razliku između interfejsa i fajlova koji sadrže deklaracije i makroe koje zahteva nekoliko C-fajlova.

Hvala vam na pažnji prema materijalu.

Programiranje Kozlova Irina Sergeevna

27. C ++ izvorni fajlovi

27. C ++ izvorni fajlovi

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 eksterno. Na primjer:

extern double sqrt (double); vanjski instream cin;

Najlakši način da se osigura konzistentnost izvornih datoteka je da iste opise postavite u zasebne datoteke koje se nazivaju zaglavlji (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 izvući 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, ime datoteke koje je u uglastim zagradama, na primjer, odnosi se na datoteku tog imena u standardnom direktoriju (obično /usr / include / CC); datoteke pohranjene na drugom mjestu se referenciraju korištenjem imena zatvorenih u dvostrukim navodnicima. Na primjer:

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

će uključiti math1.h iz direktorija trenutnog korisnika i math2.h iz / usr / bs.

Pokažimo kako bismo mogli definirati tip izlaznog toka ostream. Da stvari budu jednostavne, pretpostavimo da je tip baferovanja streambuf. streambuf tip je definiran 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 sa 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 pisma, poruke diskusionih grupa, itd. Ako želite, možete kopirati ove datoteke na medij za pohranu kako biste ih prenijeli na drugi računar.

Iz knjige Programiranje autor Kozlova Irina Sergeevna

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

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

12. Komentari. Izvorni fajlovi Komentar je skup znakova koje kompajler ignoriše. Ali ovaj skup znakova podliježe određenim ograničenjima. Ne može biti posebnih znakova unutar skupa znakova koji predstavljaju komentar, koji

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

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

Iz UNIX knjige: Procesna komunikacija autor Stevens William Richard

Fajlovi Po popularnom zahtjevu, otvorite odjeljak sa korisnim fajlovima za W2k. Odjeljak se sastoji od dva dijela, prvi su zvanične zakrpe od Microsofta (ne sve, već samo one koje nam se čine najvažnijima), a drugi dio, koji će uključivati ​​sve datoteke navedene u FAQ, samo uslužne programe,

Iz knjige Programski jezik C za lični računar autor Bochkov S.O.

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

Iz knjige Nedokumentirane i malo poznate karakteristike Windows XP-a autor Klimenko Roman Aleksandrovič

Izvorni fajlovi Tekst C programa može se podijeliti na nekoliko izvornih datoteka. Izvorna datoteka je tekstualna datoteka koja sadrži ili cijeli program ili njegov dio. Prilikom kompajliranja izvornog programa, svaki njegov sastavni izvorni fajl

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 porodično modeliranje

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

CPL datoteke Iz prethodnih nekoliko paragrafa naučili ste skoro sve teorijske proračune potrebne za rad sa 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 sudija koji određuje kako sistem funkcioniše je izvorni kod samog sistema. Na našu sreću, dostupan je besplatno. Postojeća distribucija Linuxa može uključivati ​​izvorni kod za cijeli sistem i sve

Iz knjige autora

A.3.5. Izvorni kod programa kalkulatora Listing A.3 prikazuje tekst programa koji izračunava vrijednosti postfiks izraza. Listing A.3. (calculator.c) Glavni dio programa kalkulatora / * Izračuni u unarnom formatu. * // * Jednolinijski 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 sistema 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 Unix", autora Briana Kernighana i Roba Pikea (Prentice Hall, 1984, ISBN 0-13-937681-X). Zasebna hoc6 distribucija sadrži sve popravke koje smo primenili na to; verzija u ovoj datoteci je iz knjige Autorska prava © 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 podsistem koji je kritičan za misiju sa prilično malim javnim interfejsom i puno neimplementiranog implementacionog koda. Kod pokreće do nekoliko hiljada linija, stotine privatnih funkcija i dosta privatnih podataka. Ako radite sa netrivijalnim ugrađenim sistemima, vjerovatno se često suočavate s ovom situacijom.

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

Sa C-om možete izgubiti mnogo. 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, dobijate -

    Poboljšanja performansi i veličine koda - U mnogim slučajevima, pozivi funkcija će biti ugrađeni. Čak i bez inlaya, kompajler ima mogućnost da generiše efikasniji kod.

    Podaci i funkcije na nivou kanala su skriveni.

    Izbjegavanje zagađenja prostora imena i njegovih posljedica - možete koristiti manje glomazna imena.

    Brže sastavljanje i povezivanje.

Ali takođe dobijate opaki nered kada je u pitanju uređivanje tog fajla i gubite podrazumevanu modularnost. Ovo se može prevazići cijepanjem izvornog koda na 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 savjeti su -

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

    Imajte jednu glavnu .c datoteku koja uključuje sve podređene .c datoteke. Takođe može uključiti kod za otvoreni interfejs.

    Koristite zaštitu kompajlera tako da privatna zaglavlja i izvorne jedinice ne budu uključene od strane eksternih kompilacijskih jedinica.

    Svi lični podaci i funkcije moraju biti proglašeni 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 mnogo statičnih oglasa.

    Osim ako vaš lanac alata ne nameće bilo kakav razlog, ne biste trebali specificirati 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). Ogromna prednost je u tome što će drugi alati (kao što je IDE) pravilno rukovati ovim datotekama.

Ekstenzija datoteke je irelevantna za većinu C kompajlera, tako da će raditi.

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

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

Ne znam koji program koristite sa .prj datotekom. Ako koristite nešto kao što je "make" ili Visual Studio ili bilo šta drugo, samo se pobrinite da postavite njegovu listu datoteka tako da se kompajlira bez one koja se ne može kompajlirati nezavisno.

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 tako što ćete pogledati svojstva izvornih datoteka koje želite uključiti, obično desnim klikom na njih i klikom na svojstva, i poništavanjem / kvačicom compile / link / exclude from assembly, ili bilo koji drugi opcija... možda. Ili ne možete uključiti datoteku u sam projekat, tako da IDE čak ni ne zna da postoji i neće pokušati da je prevede. A sa make-fajlovima, jednostavno niste stavili fajl u njega radi kompilacije i povezivanja.

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

Uključivanje C datoteke u drugi fajl je legalno, ali nije preporučljivo osim ako ne znate tačno zašto to radite i šta pokušavate da postignete.
Prilično sam siguran da ćete, ako ovdje objavite razlog zašto se vaše pitanje prenosi zajednici, pronaći drugi odgovarajući način da postignete svoj cilj (zapazite „skoro“ jer bi to moglo biti rješenje s obzirom na kontekst).

Inače, propustio sam drugi dio pitanja. Ako je C datoteka uključena u drugu datoteku i istovremeno uključena u projekat, vjerovatno ć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 upravo onako kako vi želite.

Međutim, postoji mnogo okvira (i IDE i mnogi ručno izrađeni Makefile) koji čekaju da kompajliraju * .c - ako se to dogodi, vjerovatno ćete naići na greške povezivača zbog duplih simbola.

Općenito, ovu praksu treba izbjegavati.

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

Ovo je u redu? da, kompajlirat će se

da li se preporučuje? no - .c datoteke se kompajliraju u .obj datoteke koje su povezane nakon kompilacije (od strane povezivača) u izvršnu datoteku (ili biblioteku), tako da nema potrebe da se jedan .c fajl uključuje u drugi. Umjesto toga, najvjerovatnije biste željeli napraviti .h datoteku koja navodi funkcije/varijable dostupne u drugoj .c datoteci i uključiti .h datoteku

Možete koristiti gcc kompajler na linuxu da povežete dva fajla sa jednim izlazom. Pretpostavimo da imate dva c fajla, jedan je "main.c", a drugi je "support.c". Dakle, komanda za povezivanje ovo dvoje

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

Ove dvije datoteke će biti povezane sa istim main.out izlazom. 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 eksterne memorije.

Top srodni članci