Cum se configurează smartphone-uri și PC-uri. Portal informativ

fișier sursă c. Online Includerea unui fișier sursă C în altul? Împărțirea textului programului în module



Puteți include corect fișiere .C sau .CPP în alte fișiere sursă. În funcție de IDE-ul dvs., puteți preveni, de obicei, dubla legătură analizând 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 debifați/bifați compilare/link/exclude din build sau orice altceva. pot fi. 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 un fișier în el pentru a compila și a lega.

EDIT: Îmi pare rău că am dat un răspuns în loc să răspund la alte răspunsuri :(

În funcție de mediul dvs. de construcție (nu veți specifica), puteți găsi că funcționează exact așa cum doriți.

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

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.

M-am gândit să împărtășesc o situație în care echipa mea a decis să includă fișierele .c. Arhitectul nostru constă în principal din module care sunt decuplate printr-un sistem de mesaje. Acești handlere de mesaje sunt publice și apelează la multe funcții locale de lucru statice pentru a-și face treaba. Problema a apărut când am încercat să obținem acoperire pentru cazurile noastre de testare unice, deoarece singura modalitate de a implementa acest cod privat de implementare a fost indirect prin interfața publică de mesaje. Cu unele caracteristici ale lucrătorilor în poala stivei, acest lucru s-a dovedit a fi un coșmar pentru a oferi o acoperire adecvată.

Includerea fișierelor .c ne-a oferit posibilitatea de a ajunge la roțile din mașină, ne-a interesat să testăm.

Includerea unui fișier 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 motivul pentru care întrebarea dvs. este raportată comunității, veți găsi o altă modalitate potrivită de a vă îndeplini obiectivul (notați „aproape”, deoarece este posibil ca aceasta să fie o soluție, având în vedere context).

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

Limbajul C nu interzice un astfel de tip #include, dar unitatea de traducere rezultată trebuie să fie totuși un 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ă îl setați la o listă de fișiere care trebuie compilate fără unul care nu poate fi compilat independent.

trebuie să adaugi un titlu ca acesta

#include

notă: ambele fișiere trebuie plasate în același loc

Puteți folosi compilatorul gcc pe Linux pentru a lega două fișiere la 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 o 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 în main și folosind clasa de stocare externă.

Extensia de fișier nu contează 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. La conectarea, acest lucru poate duce la dublarea anumitor caractere.

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

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

Deși „î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 are 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 o 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 a funcțiilor de interfață și de locul în care sunt implementate. De exemplu, dacă faceți diagramele mai detaliate, vă puteți imagina cazul în care funcțiile de interfață sunt implementate în fișiere diferite:


Această opțiune de implementare duce la o coeziune ridicată a codului, testabilitate scăzută și dificultate în reutilizarea unor astfel de module.
Pentru a nu avea astfel de dificultăți, tratez întotdeauna fișierul C și fișierul antet ca pe 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 tipuri private, macrocomenzi și funcții 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 _c și _h din numele fișierelor au fost adăugate din cauza imposibilității de a folosi un punct în instrumentul pe care îl obișnuiam). creați diagrame):


Din diagramă se poate observa că avem de-a face de fapt 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 este înapoi ca o copie în ambele fișiere C. Desigur, acest lucru nu este foarte convenabil de întreținut. Dar 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 mai multor fișiere C.

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

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

suport.microsoft

Când editați fișierele sursă în Visual C++ și le salvați, liniile trebuie să se încheie cu combinația de caractere „CR/LF” [retur car, avans linie]. Pe sistemele UNIX, liniile se termină cu „LF”. Prin urmare, la vizualizarea fișierelor care au fost modificate în grupul Windows pe sisteme UNIX, pe linii pot apărea multe caractere „^M”. Acest lucru se întâmplă numai când se folosește un editor care nu știe cum să interpreteze fișierul Windows. Visual C++ poate deschide fișiere care au linii 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-ul care era anterior pe sistem).

Acest articol Descrie procedurile pentru salvarea unui fișier modificat creat pe platforma Windows într-un format care poate fi utilizat pe sistemele 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 butonul thrn da. Selectați din lista derulantă Codificarea șirului UNIX (LF), apoi faceți clic pe butonul Bine.

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 sfârșit de linie pentru „LF”:

  1. Pentru a crea unul nou folosind aplicațiile de consolă Win32, un proiect gol numit DOS2UNIX.
  2. Din Fişier meniu, apăsați butonul Nou, apoi faceți clic pe butonul Fișiere fila.
  3. Selectați Fișier sursă C/C++ș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) ( 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. Din Clădire meniu, apăsați butonul Creați DOS2UNIX.exe pentru a crea un fișier EXE.

Poate fi necesar să testați acest fișier exe pentru a vedea dacă funcționează corect. Pentru a face acest lucru, deschideți fișierul în Visual C++ Binary Editor Dacă selectați Deschisîntr-un grup Fişier meniu selectând DOS2UNIX.ex, Setări Deschide ca La care Binar, apoi făcând clic Deschis. De exemplu, dacă fișierul conține „hellocrlfworld”, datele binare (hexazecimale) vor 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

Rulați comanda dos2unix.exe din linia de comandă . Apoi, deschideți fișierul în Editorul binar Visual C++. Veți vedea că 0x0d s sunt eliminate. Până când nu editați fișierul și îl salvați în Visual C++ 0x0d s nu va apărea.

Puteți utiliza acest lucru împreună cu modelele de automatizare Visual C++ pentru a automatiza întregul proces. Un simplu script macro Microsoft Visual Basic poate fi scris pentru a invoca 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 Setare, apoi faceți clic pe butonul Serviciu fila.
  2. Specificați un nume, cum ar fi DOS2UNIX, și specificați calea completă către Dos2unix.exe în Comanda câmp de editare.
  3. Setați argumentul la $(Filename)$(FileExt).
  4. Specificați directorul sursă $(WkspDir) (specificați propria cale).

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

Dacă doriți să automatizați acest proces, 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, atunci 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) „Acest lucru va apela instrumentul utilizatorului din meniul Instrumente. „Schimbați numărul în funcție de ceea ce aveți. În mod implicit, aveți doar „6 instrumente în meniul Instrumente, deci instrumentul DOS2UNIX va fi al 7-lea. ExecuteCommand „UserTool7” End Sub

Acest cod VBScript va funcționa numai dacă aveți fișiere deschise în Editorul Visual C++. Acesta este singurul mod de a apela un fișier .exe dintr-o macrocomandă VBScript (macromorile VBScript nu pot fi transmise parametri). 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 .dsm existent sau creați unul.
  2. Lipiți codul pe care l-ați furnizat mai devreme în fișier.
  3. În Visual C++, faceți următoarele.
    1. Din Serviciu meniu, apăsați butonul Setare.
    2. Faceți clic pe butonul Macro și fișiere suplimentare fila.
    3. Faceți clic pe butonul Prezentare generalăîncă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 lista de fișiere cu caseta de selectare selectată lângă ea.
    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, macro-ul apelat și toate 0x0d s vor fi eliminate din fișierul deschis. Deoarece acest lucru va afecta orice fișier salvat de acum înainte și aplicat oricărui proiect pe care îl deschideți în viitor, asigurați-vă că dezactivați macrocomanda din Serviciu meniu cu Setare(debifați caseta de lângă macrocomandă).

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 trebuie să fie compilat separat și apoi legat de alte fișiere printr-un linker. Fișierele sursă separate pot fi combinate într-un singur fișier sursă compilat ca o singură unitate folosind directiva preprocesor #include.

Un fișier sursă poate conține orice combinație consistentă de directive, indicii de compilator, declarații și definiții. Integritatea înseamnă că obiectele precum definițiile de funcții, structurile de date sau un set de directive de compilare condiționată conexe trebuie să fie în întregime localizate într-un fișier, adică nu pot începe într-un fișier și nu pot continua în altul.

Fișierul sursă nu trebuie să conțină instrucțiuni executabile. Uneori este convenabil să plasați definiții de variabile într-un fișier, iar în alte fișiere să folosiți aceste variabile prin declararea lor. În acest caz, definițiile variabilelor devin ușor de căutat și modificate. Din aceleași motive, constantele numite și definițiile macro sunt de obicei colectate în fișiere separate și incluse folosind directiva preprocesor #include la fișierele sursă care le necesită.

Instrucțiunile compilatorului se aplică de obicei numai anumitor secțiuni ale fișierului sursă. Acțiunile specifice ale compilatorului specificate de indicii sunt determinate de implementarea specifică a compilatorului C.

În exemplul următor, programul sursă este format din două fișiere sursă. Funcții principalȘi max prezentate în dosare separate. Funcţie principal folosește funcția maxîn cursul implementării sale.

/* fișierul sursă 1 - funcție principală */

extern int max (int, int); /* declarația funcției */

main() /* definitia functiei */

int w = UNUL, x = DOI, y = TREI;

/* fișierul sursă 2 - funcție max */

int max (a, b) /* definiția funcției */

În primul fișier sursă, funcția max declarate dar nedefinite. O astfel de declarație de funcție se numește declarație forward; permite compilatorului să controleze apelul la o funcție înainte ca aceasta să fie definită. Definirea functiei principal conţine apeluri de funcţii max.

Liniile care încep cu # sunt directive de preprocesor. Directivele îi spun preprocesorului să înlocuiască identificatorii UNU, DOI, TREI din primul fișier sursă cu valorile corespunzătoare. Domeniul de aplicare al directivelor nu se extinde la al doilea fișier sursă.

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 declarat extern. De exemplu:

extern double sqrt(double); extern instream cin;

Cel mai simplu mod de a asigura consistența fișierului sursă este să puneț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 unde 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, numele fișierului cuprins între paranteze unghiulare, de exemplu, se referă la fișierul cu acel nume din directorul standard (de obicei /usr/include/CC); fișierele stocate în alte locații 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 directorul /usr/bs.

Să arătăm cum am putea determina tipul de flux de ieșire ostream. Pentru a simplifica sarcina, să presupunem că tipul streambuf este definit pentru buffering. Tipul streambuf este definit în același loc cu definiția actuală a lui ostream. Valoarea 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: o parte privată (privată), care conține informații utilizate numai de dezvoltatorul său, și o parte publică (publică), care este interfața de tip cu utilizatorul.

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

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

Din cartea Programare autor 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 ignorat de compilator. Dar acest set de caractere este supus anumitor restricții. În setul de caractere care reprezintă un comentariu, nu pot exista caractere speciale care

Din cartea Microsoft Visual C++ și MFC. Programare pentru Windows 95 și Windows NT autor 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ț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

Din cartea UNIX: Process Interaction autor Stephens William Richard

Fișiere La cererea populară, deschidem o secțiune 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 un computer personal autorul Bochkov S. O.

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

Din cartea Caracteristici nedocumentate și puțin cunoscute ale Windows XP autor 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 de intrare pentru modelarea solidelor

Din cartea UNIX: Network Application Development autor Stephens William Richard

Anexa 3 Date inițiale pentru familiile de modelare

De la Wiki-Guvern [Cum tehnologia poate face puterea mai bună, democrația mai puternică și 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 o descriere

Din cartea UNIX - Mediu de programare universal autorul Pike Rob

1.5.4. Sursa Linux este un sistem open source, nu-i așa? Cel mai bun judecător al modului în care funcționează un sistem 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. Texte sursă ale programului de calculator Listarea A.3 arată textul programului care calculează valorile expresiilor postfixe Lista A.3. (calculator.c) Partea principală a calculatorului/* Calcule în format unar. *//* O singura linie

Din cartea autorului

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

Din cartea autorului

Din cartea autorului

Anexa 3 Sursele Hoc Calculator 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. Drepturi de autor © Lucent Technologies, 1997. Toate drepturile rezervatePermisiunea de a utiliza, copia, modifica și distribui acest software și documentația acestuia pentru

Top articole similare