Meny
Är gratis
checka in
den huvudsakliga  /  FÖRBI / Källfil C. Online inklusive en källfil C i en annan? Vad kan vara i rubrikfilen

Källfil C. Online inklusive en källfil C i en annan? Vad kan vara i rubrikfilen

Källfiler

Texten i SI-programmet kan delas upp i flera källfiler. Källfilen är en textfil som innehåller antingen hela programmet eller en del av det. Vid sammanställning av källprogrammet måste var och en av komponenterna i källfilerna sammanställas separat och sedan associeras med andra filer av länken. Separata källfiler kan kombineras till en källfil, sammanställd som ett enda heltal, genom förprocessordirektivet #Omfatta..

Källfilen kan innehålla någon holistisk kombination av direktiv, vilket indikerar kompilatorn, annonser och definitioner. Under integritet är det underförstått att sådana föremål som definitioner av funktioner, datastrukturer eller en uppsättning konventionella sammanställningsdirektiv måste vara helt placerade i en fil, dvs de kan inte starta i en fil, men fortsätta i den andra.

Källfilen behöver inte innehålla de exekverade operatörerna. Ibland är det bekvämt att placera variabla definitioner i en fil, och i andra filer för att använda dessa variabler med AD. I det här fallet blir definitionerna av variabler lättillgängliga för att söka och modifiera. Av samma överväganden samlas vanligtvis konstanter och makrodefinitioner i separata filer och inkluderar dem genom ett förprocessordirektiv. #Omfatta. I de källfiler där de är nödvändiga.

Obs! Kompilator gäller vanligtvis endast för enskilda sektioner av källfilen. De specifika handlingarna i den kompilator som anges av anvisningarna bestäms av det specifika genomförandet av SI-språkkompilatorn.

I följande exempel består källprogrammet av två källfiler. Funktioner huvud. och max Presenteras i separata filer. Fungera huvud. använder funktionen max i processen med dess utförande.

/ * Källfil 1 - Main * /

externt int max (int, int); / * Funktionsfunktion * /

huvud () / * Funktionsdefinition * /

int w \u003d en, x \u003d två, y \u003d tre;

/ * Källfil 2 - Max * /

iNT MAX (A, B) / * Funktionsdefinition * /

I den första källfilfunktionen max deklarerade, men inte definierade. En sådan annonsfunktion kallas preliminär; Det gör det möjligt för kompilatorn att styra överklagandet till funktionen innan den definieras. Definition av funktion huvud. Innehåller funktionssamtal max.

Rader som börjar med symbolen # är preprocessorns direktiv. Direktiv indikerar preprocessorn på behovet av att ersätta i den första källfilen av den två, två, tre identifierare till motsvarande värden. Direktivområdet gäller inte den andra källfilen.



Beroende på din monteringsmiljö (du anger inte) kan du upptäcka att det fungerar exakt som du vill.

Det finns dock många miljöer (både IDE och många manuellt bearbetade Makefile), som väntar på kompilering * .c - Om det händer, kommer du sannolikt att komma över länkfel på grund av dubbelarbete.

I regel bör denna praxis undvikas.

Om du måste aktivera källan (och vanligtvis bör den undvikas), använd en annan fil för filen.

Aktivera C-filen till en annan fil är laglig, men inte lämplig om du definitivt inte vet varför du gör det och vad som försöker uppnå.
Jag är nästan övertygad om att om du publicerar en anledning här, enligt vilken din fråga kommer att meddelas till samhället, hittar du ett annat lämpligt sätt att uppnå ditt mål (var uppmärksam på "nästan", eftersom det är möjligt att detta beslut, ges sammanhanget).

Förresten missade jag den andra delen av frågan. Om C-filen är aktiverad i en annan fil och samtidigt som du ingår i projektet, kommer du förmodligen att stöta på problemet med dupliceringstecken, varför objektbindning, det vill säga samma funktion kommer att definieras två gånger (om de bara inte är statiska ).

Språk C förbjuder inte denna typ av #include, men den resulterande översättningsenheten måste fortfarande vara giltig C.

Jag vet inte vilket program du använder s.prr-fil. Om du använder något som "gör" eller visuell studio eller något annat, se till att du installerar sin lista över filer som måste sammanställas utan att det inte kan sammanställas oberoende.

Du kan använda GCC-kompilatorn i Linux för att binda två filer med en utgång. Antag att du har två C-filer, varav en är "main.c", och den andra är "support.c". Således, kommandot för att ansluta dessa två

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

Dessa två filer kommer att vara associerade med en main.out-utgång. För att starta utgångskommandot kommer det att vara

./main.out.

Om du använder Main.C-funktionen, som deklareras i filen support.c, måste du förklara det för det mesta också med hjälp av den externa lagringsklassen.

Används korrekt kan det vara en användbar metod.

Antag att du har ett komplicerat kritiskt delsystem med ett ganska litet offentligt gränssnitt och mycket orealiserad implementeringskod. Koden fungerar upp till flera tusen rader, hundratals privata funktioner och ganska lite privata data. Om du arbetar med nontrivial inbyggda system, klarar du förmodligen ofta den här situationen.

Ditt beslut är sannolikt att vara multi-nivå, modulärt och frigjort, och dessa aspekter kan vara bekvämt att representeras och förstärkas genom att koda olika delar av delsystemet i olika filer.

Med C kan du förlora mycket genom att göra det. Nästan alla verktyg ger anständig optimering för en enda kompileringsenhet, men mycket pessimistiskt hänvisar till något deklarerat externt.

Om du lägger allt i en källmodul C, kommer du att få -

    Förbättring av produktivitet och storlekskod - I många fall kommer funktionssamtalen att byggas. Även utan inlägg har kompilatorn möjligheter att skapa en effektivare kod.

    Kanalnivådata och funktioner är dolda.

    Att undvika namnrymdföroreningar och dess konsekvens - du kan använda mindre skrymmande namn.

    Snabbare kompilering och kommunikation.

Men du får också en ond röra när det gäller att redigera den här filen, och du förlorar den underförstådda modulariteten. Detta kan övervinnas genom att dividera källkoden i flera filer och vända dem till en enda kompileringsenhet.

Men du måste införa några avtal för att klara av detta. I viss utsträckning beror det på din instrumental kedja, men några allmänna pekare -

    Placera det öppna gränssnittet i en separat rubrikfil - du måste fortfarande göra det.

    Har en huvudfil.c, som innehåller alla barnfiler. Det kan också innehålla koden för det öppna gränssnittet.

    Använd kompilatorproteserna så att privata rubriker och källmoduler inte ingår i externa kompileringsmoduler.

    Alla personuppgifter och funktioner måste deklareras statiska.

    Upprätthålla en konceptuell skillnad mellan every.h.h-filer. Den använder befintliga avtal. Skillnaden är att du kommer att ha många statiska annonser i dina rubriker.

    Om din verktygskedja inte pålägger några baser, bör du inte ange privata implementeringsfiler som .c I.H. Om du använder aktiverade vakter kommer de inte att generera kod och kommer inte att ange några nya namn (som ett resultat kan du stöta på några tomma segment). En stor fördel är att andra verktyg (till exempel IDE) kommer att behandla dessa filer i enlighet med detta.

Filförlängningen spelar ingen roll för de flesta C-kompilatorer, så det kommer att fungera.

Men beroende på inställningarna för din fil eller projekt, kan den C-fil som ingår generera en separat objektfil. Vid bindning kan detta leda till dubbla vissa tecken.

du måste lägga till en titel som liknar detta.

#Omfatta.

obs! Båda filerna måste placeras på ett ställe.

Du kan korrekt aktivera filer.c or.cpp till andra källfiler. Beroende på din IDE-miljö kan du vanligtvis förhindra dubbel bindning genom att visa egenskaperna hos källfilerna som du vill aktivera, vanligtvis högerklicka på dem och klicka på egenskaper och avmarkera rutan / check-kompileringen / länken / utesluta från montering eller något annat alternativ. kanske. Eller du kan inte aktivera filen i själva projektet, så IDE-miljön vet inte ens att den existerar, och kommer inte att försöka kompilera det. Och med make-filer, satte du bara inte filen i den för kompilering och layout.

Redigera: Tyvärr, jag gav ett svar istället för ett svar på andra svar :(



rösta online (8)

Aktivera C-filen till en annan fil är laglig, men inte lämplig om du definitivt inte vet varför du gör det och vad som försöker uppnå.
Jag är nästan övertygad om att om du publicerar en anledning här, enligt vilken din fråga kommer att meddelas till samhället, hittar du ett annat lämpligt sätt att uppnå ditt mål (var uppmärksam på "nästan", eftersom det är möjligt att detta beslut, ges sammanhanget).

Förresten missade jag den andra delen av frågan. Om C-filen är aktiverad i en annan fil och samtidigt som du ingår i projektet, kommer du förmodligen att stöta på problemet med dupliceringstecken, varför objektbindning, det vill säga samma funktion kommer att definieras två gånger (om de bara inte är statiska ).

Filförlängningen spelar ingen roll för de flesta C-kompilatorer, så det kommer att fungera.

Men beroende på inställningarna för din fil eller projekt, kan den C-fil som ingår generera en separat objektfil. Vid bindning kan detta leda till dubbla vissa tecken.

Beroende på din monteringsmiljö (du anger inte) kan du upptäcka att det fungerar exakt som du vill.

Det finns dock många miljöer (både IDE och många manuellt bearbetade Makefile), som väntar på kompilering * .c - Om det händer, kommer du sannolikt att komma över länkfel på grund av dubbelarbete.

I regel bör denna praxis undvikas.

Om du måste aktivera källan (och vanligtvis bör den undvikas), använd en annan fil för filen.

Du kan använda GCC-kompilatorn i Linux för att binda två filer med en utgång. Antag att du har två C-filer, varav en är "main.c", och den andra är "support.c". Således, kommandot för att ansluta dessa två

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

Dessa två filer kommer att vara associerade med en main.out-utgång. För att starta utgångskommandot kommer det att vara

./main.out.

Om du använder Main.C-funktionen, som deklareras i filen support.c, måste du förklara det för det mesta också med hjälp av den externa lagringsklassen.

Jag trodde att jag skulle dela situationen när mitt lag bestämde sig för att aktivera filer. Vår arkitekt består huvudsakligen av moduler som släpps ut genom meddelandesystemet. Dessa meddelandehanterare är offentligt tillgängliga och orsakar många lokala statiska driftsfunktioner för att utföra sitt arbete. Problemet uppstod när jag försökte få en beläggning för våra enskilda testfall, eftersom det enda sättet att genomföra denna speciella implementeringskod indirekt genom det allmänna meddelandegränssnittet. Med några egenskaper hos arbetaren i knäna i stapeln visade det sig vara en mardröm för att säkerställa korrekt beläggning.

Aktivera filer.c gav oss möjlighet att komma till skruven i bilen, vi var intresserade av testning.

Språk C förbjuder inte denna typ av #include, men den resulterande översättningsenheten måste fortfarande vara giltig C.

Jag vet inte vilket program du använder s.prr-fil. Om du använder något som "gör" eller visuell studio eller något annat, se till att du installerar sin lista över filer som måste sammanställas utan att det inte kan sammanställas oberoende.

Används korrekt kan det vara en användbar metod.

Antag att du har ett komplicerat kritiskt delsystem med ett ganska litet offentligt gränssnitt och mycket orealiserad implementeringskod. Koden fungerar upp till flera tusen rader, hundratals privata funktioner och ganska lite privata data. Om du arbetar med nontrivial inbyggda system, klarar du förmodligen ofta den här situationen.

Ditt beslut är sannolikt att vara multi-nivå, modulärt och frigjort, och dessa aspekter kan vara bekvämt att representeras och förstärkas genom att koda olika delar av delsystemet i olika filer.

Med C kan du förlora mycket genom att göra det. Nästan alla verktyg ger anständig optimering för en enda kompileringsenhet, men mycket pessimistiskt hänvisar till något deklarerat externt.

Om du lägger allt i en källmodul C, kommer du att få -

    Förbättring av produktivitet och storlekskod - I många fall kommer funktionssamtalen att byggas. Även utan inlägg har kompilatorn möjligheter att skapa en effektivare kod.

    Kanalnivådata och funktioner är dolda.

    Att undvika namnrymdföroreningar och dess konsekvens - du kan använda mindre skrymmande namn.

    Snabbare kompilering och kommunikation.

Men du får också en ond röra när det gäller att redigera den här filen, och du förlorar den underförstådda modulariteten. Detta kan övervinnas genom att dividera källkoden i flera filer och vända dem till en enda kompileringsenhet.

Men du måste införa några avtal för att klara av detta. I viss utsträckning beror det på din instrumental kedja, men några allmänna pekare -

    Placera det öppna gränssnittet i en separat rubrikfil - du måste fortfarande göra det.

    Har en huvudfil.c, som innehåller alla barnfiler. Det kan också innehålla koden för det öppna gränssnittet.

    Använd kompilatorproteserna så att privata rubriker och källmoduler inte ingår i externa kompileringsmoduler.

    Alla personuppgifter och funktioner måste deklareras statiska.

    Upprätthålla en konceptuell skillnad mellan every.h.h-filer. Den använder befintliga avtal. Skillnaden är att du kommer att ha många statiska annonser i dina rubriker.

    Om din verktygskedja inte pålägger några baser, bör du inte ange privata implementeringsfiler som .c I.H. Om du använder aktiverade vakter kommer de inte att generera kod och kommer inte att ange några nya namn (som ett resultat kan du stöta på några tomma segment). En stor fördel är att andra verktyg (till exempel IDE) kommer att behandla dessa filer i enlighet med detta.

Det här är normalt? Ja, det kommer att kompilera

rekommenderas det? No-.c-filer sammanställs i filer.OBJ som är anslutna efter kompilering (Linker) i den körbara filen (eller biblioteket), så det är inte nödvändigt att inkludera en fil. C till en annan. Istället kommer du sannolikt att du vill göra en fil. H, som listar de funktioner / variabler som finns tillgängliga i en annan.c-fil och aktiverar filen.h

Denna typ av fråga jag frågade nyligen en kollega, som började programmera i SI. Och jag trodde att det var en bra anledning att dela med mig av denna fråga. Eftersom även erfarna programmerare inte alltid har liknande synpunkter på detta.

Delvis är det en fråga om smak, så vem är intresserad som jag gör, välkommen till katt.

Trots det faktum att "hela sanningen" om H-filer finns i lämplig del av beskrivningen av GCC-preprocessorn, tillåta vissa förklaringar och illustrationer.

Så, om en bokstavligen, huvudfilen (H-filen) är en fil som innehåller en deklaration och makrodefinition avsedd för användning i flera källfiler (C-filer). Vi illustrerar det.

Det är lätt att märka att funktionerna 1 och 2, liksom makro 2, nämns i båda filerna. Och för att inkludering av rubrikfiler leder till samma resultat som att kopiera innehållet till varje SI-fil, kan vi göra följande:

På detta sätt tilldelade vi helt enkelt en gemensam del av två filer och placerade den i rubrikfilen.
Men är rubrikfilen med gränssnittet i det här fallet?

  • Om vi \u200b\u200bbehöver använda den funktionalitet som fungerar 1 och 2 implementeras någon annanstans, då ja
  • Om makro 2 är endast avsedd för användning i Unit1.C och Unit2.C-filer, placerar den inte i gränssnittsfilen
Dessutom behöver vi verkligen ha två SI-filer för att implementera gränssnittet som definieras i rubrikfilen? Eller är en?
Svaret på denna fråga beror på detaljerna i genomförandet av gränssnittsfunktioner och från deras genomförandeplats. Om du till exempel gör diagram mer detaljerade kan du skicka ett alternativ när gränssnittsfunktionerna implementeras i olika filer:


Denna utföringsform leder till höga koder, låga test och komplexiteten av återanvändning av sådana moduler.
För att inte ha sådana svårigheter, anser jag alltid en C-fil och en rubrikfil som en modul. I vilken,
  • header-filen innehåller endast de deklarationer av funktioner, typer, makron som ingår i gränssnittet i den här modulen.
  • C-filen måste i sin tur innehålla genomförandet av alla funktioner som deklarerats i H-filen, såväl som privata typer, makron och funktioner som behövs för att implementera gränssnittet.
Om jag hade möjlighet att genomföra koden som diagrammet användes ovan, skulle jag försöka uppnå följande (slutet av _C och _h i filnamn som läggs till på grund av omöjligheten att använda punkten i verktyget som jag brukade använda Skapa diagram):


Diagrammet visar att vi faktiskt har att göra med två oberoende moduler, som alla har sitt eget gränssnitt i form av en rubrikfil. Detta gör det möjligt att bara använda det gränssnittet som verkligen är nödvändigt i det här fallet. Dessutom kan dessa moduler testas oberoende av varandra.
Läsaren märkte förmodligen att makro 2 från rubrikfilen återvände igen som en kopia i båda SI-filerna. Det är självklart inte särskilt bekvämt att stödja. Men också för att göra den här makro delen av gränssnittet är inte korrekt.
I sådana fall föredrar jag att göra en separat rubrikfil som innehåller typer och makron som behövs av flera SI-filer.

Jag hoppas jag lyckades identifiera de enheter som måste placeras i rubrikfiler. Förutom, visa skillnaden mellan gränssnitt och filer som innehåller deklarationer och makron som behövs av flera SI-filer.

Tack för er uppmärksamhet på materialet.

support.microsoft.

När du byter källfiler i Visual C ++ och spara dem måste strängarna slutföra tecknen "CR / LF" [CARRANY RETURN-symbolen, rad översättning] kombinationen. I UNIX-system är strängarna färdiga med "LF". När du tittar på de filer som har ändrats i Windows-gruppen i UNIX-system kan set "^ m" tecken visas i rader. Detta händer bara när du använder redigeraren vet inte hur du tolkar Windows-filen. Visual C ++ Du kan öppna filer, i strängar som slutar med skapandet av UNIX LF. Om du ändrar den här filen och sparar den från Visual C ++, och sedan sparas i Windows-format (du kommer att se CR / LF och inte LF, som tidigare var i systemet).

I den här artikeln beskrivs procedurerna för att spara den ändrade filen som skapats på Windows-plattformen i ett format som kan användas i UNIX-system.

NOTERA: Visual C ++. Net IDE innehåller funktioner tillgängliga för att spara filen i UNIX-format. I en integrerad utvecklingsmiljö, spara filen med Spara som..., välj Spara från rullgardinsmenyn Spara med kodning ...och klicka på THRN-knappen Ja. Välj från rullgardinsmenyn. Radkodning Unix (LF)och klicka sedan på OK.

Du kan använda följande steg för att skapa ett Win32-konsolprogram som konverterar en fil som innehåller "CR / LF" för att slutföra strängen för "LF":

  1. För att skapa ett nytt Win32-tomt projekt med namnet DOS2UNIX med hjälp av Win32-konsolprogrammen.
  2. Av Fil Meny, klicka på Nyoch klicka sedan på Filer Flik.
  3. Välja Källfil C / C ++ Och ange namnet på den nya dos2unix.cpp-filen.
  4. Sätt i följande kod i DOS2UNIX.CPP:

    #Omfatta. #Omfatta. #Omfatta. Med namnespace std; INT MAIN (INT ARGC, CHAR * ARGV) (IF (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. Av Byggnad Meny, klicka på Skapa dos2unix.exe. För att skapa en EXE-fil.

Det kan vara nödvändigt att kontrollera den här EXE-filen för att se om den fungerar korrekt. För att göra detta, öppna filen i den visuella C ++ binär redigeraren när du väljer Öppna i en grupp Fil Meny genom att välja dos2unix.ex, inställning Öppna som Kom. Binäroch klicka sedan på Öppna. Till exempel, om filen innehåller "Hellocrlfworld", kommer den binära fildata (hexadecimal) att se ut så här:

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

Detta motsvarar:

Hej
Fred

I kommandotolken, kör kommandot dos2unix.exe . Öppna sedan filen i Biny Editor i Visual C +++. Du kommer att se att 0x0d s raderas. Innan du ändrar filen och sparar den i Visual C ++ 0x0D s kommer inte att visas.

Detta kan användas i kombination med Visual C ++ Automation Model automatisera hela processen. Enkelt Microsoft Visual Basic Macro Scenario kan skrivas för att kalla den här fonden, men först måste du lägga till Service Menyn är som följer:

  1. Av Service Meny, klicka på Miljöoch klicka sedan på Service Flik.
  2. Ange namnet, till exempel DOS2UNIX och ange den fullständiga sökvägen till filen dos2unix.exe in Team Redigeringsfält.
  3. Ange för argument, $ (filnamn) $ (FileEtext).
  4. Ange källkatalogen $ (wkspdir) (ange din egen sökväg).

För att kontrollera programmet, öppna filen i Visual C ++ editor, och sedan från Service Lanseringsmeny Dos2unix. innebär att. Du kommer att se att alla sina CR-tecken raderades i redigeraren.

Om du behöver automatisera den här processen för att bearbeta på ett sådant sätt att varje gång du sparar den öppna filen i VISUAL C +++, kallas DOS2UNIX.EXE-verktyget för att ta bort 0x0d s och använd sedan följande VBScript-makro:

"Det här dokumentet avfyras varje gång dokumentet sparas i VC ++ - Editor. Sub Application_documentsave (Thedocument)" Detta kommer att ringa användarverktyget i Verktyg-menyn. "Ändra numret beroende på vad du har. Som standard har du bara" 6 verktyg under verktygsmenyn, så dos2unixverktyget blir den 7: e. ExecuteCommand "Usertool7" End Sub

Den här VBScript-koden fungerar endast om du har filer öppna för den visuella C ++ -redigeraren. Detta är det enda sättet att ringa en EXE-fil från ett VBScript-makro (VBScript-makro kan inte överföras till parametrarna). Du kan skriva i stället och det blir mer flexibelt. Ring "dos2unix.exe" -verktyget från tillägget utan att behöva lägga till den till Service meny.

I Visual C ++ med hjälp av makron som tillhandahålls av VBScript:

  1. Öppna en befintlig fil med tillägg.dsm eller skapa en.
  2. Sätt i den kod som tidigare visas i filen.
  3. Följ dessa steg i Visual C ++.
    1. Av Service Meny, klicka på Miljö.
    2. tryck på knappen Makrofiler och tillägg Flik.
    3. tryck på knappen Översikt Hämta file.dsm som innehåller makro. En gång i file.dsm valdes i Översiktdialogrutan, filen visas i Kosttillskott och makron Lista över filer med den valda kryssrutan bredvid den.
    4. tryck på knappen Stänga att fortsätta.

Nu, om du öppnar filen i Visual C ++ - Editor och spara från filen Fil Menyn som heter Macro och alla 0x0d s kommer att raderas från den öppna filen. Eftersom det påverkar någon fil, spara från och med nu och ansöka om något projekt som öppnas i framtiden, se till att du stänger av makro från Service Meny med hjälp Miljö (Avmarkera kryssrutan bredvid makro).