Cum se configurează smartphone-uri și PC-uri. Portal informativ
  • Acasă
  • Fier
  • Fișierul sursă c. Ce ar trebui să fie în fișierul c și ce ar trebui să fie în fișierul h? Ce poate fi în fișierul antet

Fișierul sursă c. Ce ar trebui să fie în fișierul c și ce ar trebui să fie în fișierul h? Ce poate fi în fișierul antet

suport.microsoft

Când modificați fișierele originale în Visual C ++ și le salvați, liniile trebuie să fie terminate cu combinația „CR / LF” [retur car, avans linie]. Pe sistemele UNIX, liniile se termină cu „LF”. Prin urmare, când vizualizați fișiere care s-au modificat în grupul Windows pe sisteme UNIX, este posibil să vedeți multe caractere „^ M” în șiruri. Acest lucru se întâmplă doar atunci când editorul nu știe cum să interpreteze fișierul Windows. Visual C ++ poate deschide fișiere în apropierea liniilor care se termină cu crearea UNIX LF. Dacă modificați acest fișier și îl salvați din Visual C ++, atunci acesta este salvat în format Windows (veți vedea CR / LF și nu LF care era anterior pe sistem).

Acest articol descrie procedurile pentru salvarea unui fișier modificat creat pe o platformă Windows într-un format care poate fi utilizat pe sisteme UNIX.

NOTĂ: Visual C ++.NET IDE conține funcții disponibile pentru salvarea unui fișier în format UNIX. În IDE, salvați fișierul cu Salvează ca..., selectați Salvare din lista verticală Salvați cu codificare..., și apăsați thrn da... Selectați Codificarea șirurilor din lista verticală UNIX (LF)și apoi faceți clic O.K.

Puteți folosi următorii pași pentru a crea un proiect de aplicație consolă Win32 care convertește un fișier care conține „CR / LF” la terminarea de linie pentru „LF”:

  1. Pentru a crea un nou proiect gol, numit DOS2UNIX, folosind aplicațiile de consolă Win32.
  2. Din Fişier meniu, apăsați butonul Nouși apoi faceți clic Fișiere Tab.
  3. Te rog selecteaza C / C ++ Fișier sursăși introduceți numele noului fișier DOS2UNIX.cpp.
  4. Lipiți următorul cod în DOS2UNIX.cpp:

    #include #include #include folosind namespace std; int main (int argc, char * argv) (dacă (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. Din Clădire meniu, apăsați butonul Se creează DOS2UNIX.exe pentru a crea un fișier EXE.

Poate fi necesar să verificați acest fișier exe pentru a vedea dacă funcționează corect. Pentru a face acest lucru, deschideți fișierul în editorul binar Visual C ++ Când alegeți Deschis in grup Fişier meniu selectând DOS2UNIX.ex, Setare Deschide ca La care Binarși apoi făcând clic Deschis... De exemplu, dacă fișierul conține „hellocrlfworld”, fișierul de date binare (hexazecimal) ar arăta astfel:

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

Aceasta este echivalentă cu:

Hei
Pace

La promptul de comandă, rulați dos2unix.exe ... Apoi, deschideți fișierul în editorul binar Visual C ++. Veți vedea că 0x0d s sunt eliminate. Până când nu modificați fișierul și îl salvați în Visual C ++ 0x0d s nu va apărea.

Acesta poate fi folosit împreună cu Modelul de automatizare Visual C ++ pentru a automatiza întregul proces. Macro-urile de script Microsoft Visual Basic simple pot fi scrise pentru a apela acest instrument, dar mai întâi trebuie să adăugați acest instrument Serviciu meniul arata asa:

  1. Din Serviciu meniu, apăsați butonul Personalizareși apoi faceți clic Serviciu Tab.
  2. Specificați un nume, cum ar fi DOS2UNIX și specificați calea completă către fișierul Dos2unix.exe în Echipă câmp de editare.
  3. Setați argumentul la $ (Filename) $ (FileExt).
  4. Specificați directorul sursă $ (WkspDir) (furnizați propria cale).

Pentru a testa programul, deschideți fișierul într-un editor Visual C ++ și apoi din Serviciu meniul de lansare DOS2UNIX mijloace. Veți vedea că fișierul deschis în editor are toate caracterele CR eliminate.

Dacă doriți să automatizați acest proces, gestionați astfel încât de fiecare dată când salvați un fișier deschis în editorul Visual C ++, instrumentul DOS2UNIX.exe este apelat pentru a elimina 0x0d s, apoi utilizați următoarea macrocomandă VBScript:

"Acest eveniment este declanșat de fiecare dată când documentul este salvat în Editorul VC ++. Sub Application_DocumentSave (theDocument)" Aceasta va apela instrumentul utilizatorului din meniul Instrumente. „Schimbați numărul în funcție de ceea ce aveți. În mod implicit doar dvs.” aveți 6 instrumente în meniul Instrumente, astfel încât instrumentul DOS2UNIX va fi al 7-lea. ExecuteCommand „UserTool7” End Sub

Acest cod VBScript va funcționa numai dacă aveți fișierele deschise în Editorul Visual C ++. Acesta este singurul mod de a apela un fișier exe dintr-o macrocomandă VBScript (o macrocomandă VBScript nu poate fi transmisă parametrilor). Puteți scrie în schimb și va fi mai flexibil. Apelați instrumentul „DOS2UNIX.exe” din programul de completare fără a fi nevoie să îl adăugați Serviciu meniul.

În Visual C ++ folosind macrocomanda VBScript furnizată:

  1. Deschideți un fișier existent cu extensia .dsm sau creați unul.
  2. Lipiți codul furnizat anterior în fișier.
  3. În Visual C ++, urmați acești pași.
    1. Din Serviciu meniu, apăsați butonul Personalizare.
    2. Faceți clic pe butonul Macro și fișiere suplimentare Tab.
    3. Faceți clic pe butonul Prezentare generală descărcați fișierul .dsm care conține macrocomanda. Odată ajuns, fișierul .dsm a fost selectat în Prezentare generală caseta de dialog, fișierul va apărea în Suplimente și macrocomenzi o listă de fișiere folosind caseta de selectare selectată de lângă aceasta.
    4. Faceți clic pe butonul Închide a continua.

Acum, dacă deschideți fișierul în editorul Visual C ++ și salvați din fișier Fişier meniul apelat de macrocomandă și toate 0x0d s vor fi eliminate din fișierul deschis. Deoarece acest lucru va afecta orice fișier pe care îl păstrați de acum înainte și se va aplica oricărui proiect pe care îl deschideți în viitor, asigurați-vă că dezactivați macrocomanda din Serviciu meniu folosind Personalizare(debifați caseta de lângă macrocomandă).

O întrebare similară mi-a fost pusă recent de un coleg care începe să programeze în limbajul C. Și m-am gândit că acesta este un motiv bun pentru a împărtăși înțelegerea mea despre această problemă. Pentru că nici programatorii cu experiență nu au întotdeauna aceleași puncte de vedere în această chestiune.

Aceasta este parțial o chestiune de gust, așa că oricine este interesat de cum o fac, bine ați venit la cat.

În ciuda faptului că „întregul adevăr” despre fișierele h este conținut în secțiunea corespunzătoare a descrierii preprocesorului gcc, îmi voi permite câteva explicații și ilustrații.

Deci, literalmente, un fișier antet (h-file) este un fișier care conține declarații C și definiții macro destinate utilizării în mai multe fișiere sursă (c-fișiere). Să ilustrăm asta.

Este ușor de observat că funcțiile 1 și 2, precum și macro-ul 2, sunt menționate în ambele fișiere. Și deoarece includerea fișierelor antet produce aceleași rezultate ca și copierea conținutului în fiecare fișier C, putem face următoarele:

Astfel, pur și simplu am selectat partea comună din cele două fișiere și am plasat-o în fișierul antet.
Dar este fișierul antet o interfață în acest caz?

  • Dacă trebuie să folosim funcționalitatea pe care funcțiile 1 și 2 le implementează în altă parte, atunci Da
  • Dacă macro-ul 2 este destinat numai utilizării în fișierele Unit1.c și Unit2.c, atunci nu are loc în fișierul de interfață
Mai mult, chiar trebuie să avem două fișiere C pentru a implementa interfața definită în fișierul antet? Sau este suficient unul?
Răspunsul la această întrebare depinde de detaliile de implementare ale funcțiilor de interfață și de locul în care sunt implementate. De exemplu, dacă faceți diagramele mai detaliate, vă puteți imagina o variantă când funcțiile de interfață sunt implementate în fișiere diferite:


Această implementare duce la o coeziune ridicată a codului, testabilitate scăzută și dificultăți în reutilizarea unor astfel de module.
Pentru a nu avea astfel de dificultăți, consider întotdeauna fișierul C și fișierul antet ca un singur modul. In care,
  • fișierul antet conține doar acele declarații de funcții, tipuri, macro-uri care fac parte din interfața acestui modul.
  • Fișierul C, la rândul său, trebuie să conțină implementarea tuturor funcțiilor declarate în fișierul h, precum și tipurile private, macrocomenzile și funcțiile care sunt necesare pentru implementarea interfeței.
Astfel, dacă mi s-ar întâmpla să implementez codul care corespunde diagramei de mai sus, aș încerca să obțin următoarele (terminările _с și _h din numele fișierelor sunt adăugate din cauza incapacității de a folosi un punct în instrumentul pe care îl obișnuiam creați diagrame):


Diagrama arată că de fapt avem de-a face cu două module independente, fiecare dintre ele având propria sa interfață sub forma unui fișier antet. Acest lucru face posibilă utilizarea doar a interfeței care este cu adevărat necesară în acest caz particular. În plus, aceste module pot fi testate independent unele de altele.
Este posibil ca cititorul să fi observat că macrocomanda 2 din fișierul antet a revenit din nou ca o copie în ambele fișiere C. Desigur, acest lucru nu este foarte convenabil de întreținut. Dar nici a face această macro parte a interfeței nu este corectă.
În astfel de cazuri, prefer să fac un fișier antet separat care să conțină tipurile și macrocomenzile necesare pentru mai multe fișiere C.

Sper că am reușit să identific acele entități care trebuie plasate în fișierele de antet. Și, de asemenea, pentru a arăta diferența dintre interfețele și fișierele care conțin declarații și macrocomenzi solicitate de mai multe fișiere C.

Vă mulțumim pentru atenția acordată materialului.

Programare Kozlova Irina Sergeevna

27. Fișiere sursă C ++

27. Fișiere sursă C ++

Un program C ++ include cel mai adesea un număr mare de fișiere sursă, fiecare dintre ele conține descrieri de tipuri, funcții, variabile și constante. Pentru ca un nume să fie folosit în diferite fișiere sursă pentru a se referi la un anumit obiect, acesta trebuie descris ca fiind extern. De exemplu:

extern double sqrt (double); extern instream cin;

Cel mai simplu mod de a asigura consistența fișierelor sursă este să plasați aceleași descrieri în fișiere separate numite fișiere antet (sau antet) și apoi să includeți, adică să copiați, aceste fișiere antet în toate fișierele în care sunt necesare aceste descrieri. De exemplu, dacă descrierea sqrt se află în fișierul antet pentru funcțiile matematice standard math.h și trebuie să extrageți rădăcina pătrată a lui 4, ar trebui să utilizați programul:

Deoarece fișierele de antet obișnuite constau dintr-un număr mare de fișiere sursă, ele nu conțin descrieri care să nu fie repetate.

Într-o comandă include, un nume de fișier care se află între paranteze unghiulare, de exemplu, se referă la un fișier cu acel nume în directorul standard (de obicei / usr / include / CC); fișierele stocate în altă parte sunt referite folosind nume cuprinse între ghilimele duble. De exemplu:

#include „math1.h” #include „/usr/bs/math2.h”

va include math1.h din directorul utilizatorului curent și math2.h din / usr / bs.

Să arătăm cum am putea defini tipul fluxului de ieșire ostream. Pentru a menține lucrurile simple, să presupunem că tipul de tamponare este streambuf. Tipul streambuf este definit în același loc cu definiția actuală a lui ostream. O valoare a unui tip definit de utilizator specifică datele necesare pentru a reprezenta un obiect de acel tip și un număr mare de operații pentru a opera asupra acestor obiecte. Definiția constă din două părți: partea privată, care conține informații utilizate doar de dezvoltatorul său, și partea publică, care este interfața de tip cu utilizatorul.

Din cartea Programe și fișiere Windows autorul Klimov A

Fișiere DBX Fișierele DBX stochează înregistrările Outlook Express. Aceste fișiere, numite Banca de mesaje, conțin scrisori, mesaje de grup de știri etc. Dacă doriți, puteți copia aceste fișiere pe un mediu de stocare pentru a transfera datele pe alt computer.

Din cartea Programare autorul Kozlova Irina Sergheevna

Fișiere INF În acest articol, ne vom uita la ce este un fișier INF, cum să-l folosiți pentru a lucra cu alte fișiere și registry, pentru a crea comenzi rapide, a rula programe etc. După cum știți, un produs software mai mult sau mai puțin serios necesită de obicei un special

Din cartea Win2K FAQ (v. 6.0) autorul Shashkov Alexey

12. Comentarii. Fișiere sursă Un comentariu este un set de caractere care sunt ignorate de compilator. Dar acest set de caractere este supus anumitor restricții. Nu pot exista caractere speciale în setul de caractere care reprezintă comentariul, care

Din cartea Microsoft Visual C ++ și MFC. Programare pentru Windows 95 și Windows NT autorul Frolov Alexandru Viaceslavovici

27. Fișiere sursă C ++ Un program C ++ include cel mai adesea un număr mare de fișiere sursă, fiecare dintre ele conținând descrieri de tipuri, funcții, variabile și constante. Pentru ca numele să poată fi folosit în diferite fișiere sursă pentru a se referi la un anumit obiect, așa este

Din cartea UNIX: Process Communication autorul Stevens William Richard

Fișiere La cererea populară, deschideți secțiunea cu fișiere utile pentru W2k. Secțiunea este formată din două părți, prima este patch-urile oficiale de la Microsoft (nu toate, ci doar cele care ni se par cele mai importante), iar a doua parte, care va include toate fișierele menționate în FAQ, doar utilitare,

Din cartea Limbajul de programare C pentru computerul personal autorul Bochkov S.O.

Din cartea KOMPAS-3D pentru elevi și școlari. Desen, informatică, geometrie autorul Bolşakov Vladimir

Din cartea Caracteristici nedocumentate și puțin cunoscute ale Windows XP autorul Klimenko Roman Alexandrovici

Fișiere sursă Textul unui program C poate fi împărțit în mai multe fișiere sursă. Un fișier sursă este un fișier text care conține fie întregul program, fie o parte din acesta. La compilarea unui program sursă, fiecare dintre fișierele sursă constitutive ale acestuia

Din cartea Programare pentru Linux. Abordare profesională autorul Mitchell Mark

Anexa 2 Date inițiale pentru modelarea solidelor

Din cartea UNIX: Dezvoltarea aplicațiilor în rețea autorul Stevens William Richard

Anexa 3 Date inițiale pentru modelarea familiei

Din cartea Wiki-Government [Cum tehnologia poate face puterea mai bună, democrația mai puternică, cetățenii mai puternici] autor Novek Bet

Fișiere CPL Din paragrafele anterioare, ați învățat aproape toate calculele teoretice care sunt necesare pentru a lucra cu programul rundll32.exe. Acum vor fi enumerate posibilitățile pe care acest program le poate oferi utilizatorului. Să începem cu descrierea

Din cartea UNIX - Mediul de programare universal de Pike Rob

1.5.4. Sursa Linux este open source, nu-i așa? Judecătorul-șef care determină modul în care funcționează sistemul este codul sursă al sistemului însuși. Din fericire pentru noi, este disponibil gratuit. O distribuție Linux existentă poate include codul sursă pentru întregul sistem și tot

Din cartea autorului

A.3.5. Codul sursă al programului de calcul Listing A.3 arată textul programului care calculează valorile expresiilor postfixe.Listing A.3. (calculator.c) Partea principală a programului calculatorului / * Calcule în format unar. * // * Intrare pe o singură linie în program

Din cartea autorului

Anexa D Diverse coduri sursă D.1. Fișierul antet unp.h Aproape fiecare program din această carte începe prin includerea fișierului antet unp.h, prezentat în Lista D.1. Acest fișier include toate fișierele standard de antet de sistem necesare pentru a funcționa.

Din cartea autorului

Din cartea autorului

Anexa 3 Texte sursă ale calculatorului hoc Aceste fișiere conțin tot codul din „The Unix Programming Environment”, de Brian Kernighan și Rob Pike (Prentice Hall, 1984, ISBN 0-13-937681-X). O distribuție separată hoc6 conține orice corecții pe care le-am aplicat; versiunea din acest fișier este din carte Copyright © Lucent Technologies, 1997. Toate drepturile rezervatePermisiunea de a utiliza, copia, modifica și distribui acest software și documentația acestuia pentru



Folosită corect, aceasta poate fi o tehnică utilă.

Să presupunem că aveți un subsistem complex de misiune critică, cu o interfață publică destul de mică și mult cod de implementare neimplementat. Codul rulează până la câteva mii de linii, sute de funcții private și destul de multe date private. Dacă lucrați cu sisteme încorporate non-triviale, probabil că vă confruntați destul de des cu această situație.

Soluția dvs. este probabil să fie stratificată, modulară și decuplată, iar aceste aspecte pot fi reprezentate și îmbunătățite convenabil prin codificarea diferitelor părți ale subsistemului în fișiere diferite.

Cu C, poți pierde mult făcând asta. Aproape toate instrumentele oferă optimizări decente pentru o singură unitate de compilare, dar sunt foarte pesimiste cu privire la orice declarație externă.

Dacă puneți totul într-un singur modul C original, obțineți -

    Îmbunătățiri de performanță și dimensiunea codului - În multe cazuri, apelurile de funcții vor fi inline. Chiar și fără inlay, compilatorul are capacitatea de a genera cod mai eficient.

    Datele și funcțiile la nivel de canal sunt ascunse.

    Evitarea poluării spațiului de nume și a consecințelor acesteia - puteți folosi nume mai puțin greoaie.

    Compilare și conectare mai rapide.

Dar ai și o mizerie răutăcioasă când vine vorba de editarea fișierului respectiv și pierzi modularitatea implicită. Acest lucru poate fi depășit prin împărțirea codului sursă în mai multe fișiere și includerea lor într-o singură unitate de compilare.

Cu toate acestea, trebuie să aplicați unele convenții pentru a gestiona acest lucru. Va depinde într-o oarecare măsură de lanțul dvs. de instrumente, dar unele indicații generale sunt:

    Puneți interfața publică într-un fișier antet separat - tot ar trebui să faceți asta.

    Aveți un fișier principal .c care include toate fișierele .c secundare. De asemenea, poate include cod pentru o interfață deschisă.

    Utilizați gardieni pentru compilator, astfel încât anteturile private și unitățile sursă să nu fie incluse de unitățile de compilare externe.

    Toate datele și funcțiile personale trebuie declarate statice.

    Mențineți o distincție conceptuală între fișierele .c și .h. Folosește convențiile existente. Diferența este că veți avea o mulțime de anunțuri statice în titluri.

    Cu excepția cazului în care lanțul dvs. de instrumente impune vreun motiv, nu trebuie să specificați fișierele de implementare private ca .c și .h. Dacă utilizați gărzile incluse, acestea nu vor genera cod și nu vor introduce nume noi (ca urmare, este posibil să întâlniți câteva segmente goale). Avantajul uriaș este că alte instrumente (cum ar fi IDE) vor gestiona aceste fișiere în mod corespunzător.

Extensia de fișier este irelevantă pentru majoritatea compilatoarelor C, așa că va funcționa.

Cu toate acestea, în funcție de fișierul sau setările proiectului, fișierul c inclus poate genera un fișier obiect separat. Când este conectat, acest lucru poate duce la caractere dublu definite.

Limbajul C nu interzice acest tip de #include, dar unitatea de traducere rezultată trebuie să fie în continuare C validă.

Nu știu ce program utilizați cu fișierul .prj. Dacă utilizați ceva de genul „make” sau Visual Studio sau orice altceva, asigurați-vă că ați setat lista de fișiere pentru a fi compilate fără unul care nu poate fi compilat independent.

Puteți include corect fișierele .C sau .CPP în alte fișiere sursă. În funcție de IDE-ul dvs., puteți preveni, de obicei, dubla legare, uitându-vă la proprietățile fișierelor sursă pe care doriți să le includeți, de obicei făcând clic dreapta pe ele și făcând clic pe proprietăți și debifând / bifați compilare / link / exclude din asamblare sau orice alt varianta... poate. Sau nu puteți include fișierul în proiectul în sine, așa că IDE-ul nici măcar nu știe că există și nu va încerca să-l compileze. Și cu makefiles, pur și simplu nu ai pus fișierul în el pentru compilare și legare.

EDIT: Îmi pare rău, am dat răspunsul în loc de celelalte răspunsuri :(

Includerea fișierului C într-un alt fișier este legală, dar nu este recomandabilă decât dacă știți exact de ce o faceți și ce încercați să realizați.
Sunt destul de sigur că, dacă postați aici un motiv pentru care întrebarea dvs. este comunicată comunității, veți găsi o altă modalitate potrivită de a vă atinge obiectivul (notați „aproape”, deoarece ar putea fi o soluție dat fiind contextul).

Apropo, am ratat partea a doua a întrebării. Dacă fișierul C este inclus într-un alt fișier și în același timp inclus în proiect, este posibil să vă confruntați cu problema simbolurilor duplicate, de ce legarea obiectelor, adică aceeași funcție va fi definită de două ori (cu excepția cazului în care sunt statice ).

În funcție de mediul dvs. de construcție (nu veți specifica), s-ar putea să descoperiți că funcționează exact așa cum doriți.

Cu toate acestea, există multe medii (atât IDE-uri, cât și multe Makefile-uri realizate manual) care așteaptă să compileze * .c - dacă se întâmplă acest lucru, este posibil să întâlniți erori de linker din cauza simbolurilor duplicate.

Ca regulă generală, această practică trebuie evitată.

Dacă trebuie să # includeți sursa (și în general ar trebui evitată), utilizați un fișier diferit pentru fișier.

Este în regulă? da se va compila

este recomandat? nu - fișierele .c sunt compilate în fișiere .obj care sunt legate după compilare (de către linker) într-un executabil (sau bibliotecă), deci nu este nevoie să includeți un fișier .c într-un altul. În schimb, cel mai probabil ați dori să faceți un fișier .h care listează funcțiile/variabilele disponibile într-un alt fișier .c și să includă un fișier .h

Puteți folosi compilatorul gcc pe Linux pentru a lega două fișiere cu o singură ieșire. Să presupunem că aveți două fișiere c, unul este „main.c” și celălalt este „support.c”. Deci comanda pentru a conecta aceste două

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

Aceste două fișiere vor fi legate la aceeași ieșire main.out. Pentru a rula ieșirea, comanda ar fi

./principal.out

Dacă utilizați funcția main.c care este declarată în fișierul support.c, atunci trebuie să o declarați practic folosind și clasa de stocare externă.

Top articole similare