Sida 1 av 1

Dårfråga om C och #line [LÖST]

Postat: 07 mar 2009, 16:57
av Johnny Rosenberg
Nu satt jag här och läste igenom lite C-kod som någon annan skrivit för några år sedan. Här är ett litet utsnitt:

Kod: Markera allt

static void cleanupFastLookaheadLimiter(LADSPA_Handle instance) {
#line 188 "fast_lookahead_limiter_1913.xml"
	FastLookaheadLimiter *plugin_data = (FastLookaheadLimiter *)instance;
	free(plugin_data->buffer);
	free(instance);
}
Sökte lite på nätet och hittade följande:
The #line command is simply used to change the value of the LINE and FILE variables. The filename is optional. The LINE and FILE variables represent the current file and which line is being read. The command
Vad är detta för variabler? Vad används de till och varför? Det är i alla fall inget som verkar finnas definierat i koden i övrigt någonstans vad jag kan hitta med hjälp av textredigerarens sök-funktion, i vare sig huvudfilen eller någon av de övriga tillhörande filerna.

Re: Dårfråga om C och #line

Postat: 07 mar 2009, 17:10
av jsiei97
Johnny Rosenberg skrev:Vad är detta för variabler? Vad används de till och varför? Det är i alla fall inget som verkar finnas definierat i koden i övrigt någonstans vad jag kan hitta med hjälp av textredigerarens sök-funktion, i vare sig huvudfilen eller någon av de övriga tillhörande filerna.
Har inte använt just #line,
men rent generellt brukar alla rader i c som börjar med # vara någon till preprocessorn.

Dvs på samma sätt som man kan använda #define, #ifdef m.fl.

/Johan

Re: Dårfråga om C och #line

Postat: 07 mar 2009, 17:17
av jsiei97
Satt och funderade lite och tog gissade på att man kunde påverka __FILE__ och __LINE__ macrona som kommer
från preprocessorn.

Titta på nedan kod:

Kod: Markera allt

int main(int argc, char *argv[])
{

    printf("Test: %s : %d \n",__FILE__, __LINE__);
    printf("Test: %s : %d \n",__FILE__, __LINE__);
#line 21 
    printf("Test: %s : %d \n",__FILE__, __LINE__);

    return 0;
}
Kompilera och kör denna både med och utan #line raden,
för att se vad den hittar på.

Så här såg det ut när jag körde i alla fall:

Kod: Markera allt

Test: file_line.c : 7 
Test: file_line.c : 8 
Test: file_line.c : 21 
Lägg märke till den sista raden borde vara 9 men pga #line så är den 21 istället...

Mvh Johan

Re: Dårfråga om C och #line

Postat: 07 mar 2009, 17:20
av Lars
Värdet av #line används för felmeddelanden vid kompilering och för att inkludera debug-info i den körbara filen. När man lägger in brytpunkter i gdb använder man ofta radnumret för att ange var brytpunkten ska ligga.

Säg att man skriver en Pascal-till-C-konverterare, då kan man lägga in #file och #line för att referera till orginalkoden i Pascal. Det är det enda användningsområdet jag kan komma på just nu.

Re: Dårfråga om C och #line

Postat: 07 mar 2009, 17:39
av Johnny Rosenberg
I exemplet jag nämnde var ju även ett filnamn inkluderat, en xml-fil närmare bestämt. I den finns koden också tillgänglig, men på ett mer lättfattligt sätt och lättläst tack vare tillhörande XSLT-fil.

Skulle vara intressant att veta vad poängen är med detta. Är det för felsökning? Det som talar emot det är ju att om man då hänvisas till en XML-fil istället för C-filen, så hjälper det ju inte att ändra i den… Så poängen måste ha varit en annan. Någon som har en idé?

Re: Dårfråga om C och #line

Postat: 07 mar 2009, 17:40
av David Andersson
Johnny Rosenberg skrev:Nu satt jag här och läste igenom lite C-kod som någon annan skrivit för några år sedan. Här är ett litet utsnitt:

Kod: Markera allt

static void cleanupFastLookaheadLimiter(LADSPA_Handle instance) {
#line 188 "fast_lookahead_limiter_1913.xml"
Det är troligt att den "någon annan" som skrivit C-koden inte är en människa utan ett program. I så fall ett program som konverterar innehållet i en xml-fil till C-kod. Såna program brukar lägga in "#line" så att felmeddelanden från C-kompilatorn kommer att hänvisa till filnamn och radnummer i xml-filen i stället för C-filen.

Har du xml-filen? Är den skriven av en människa?

Re: Dårfråga om C och #line

Postat: 07 mar 2009, 21:53
av Johnny Rosenberg
David Andersson skrev:
Johnny Rosenberg skrev:Nu satt jag här och läste igenom lite C-kod som någon annan skrivit för några år sedan. Här är ett litet utsnitt:

Kod: Markera allt

static void cleanupFastLookaheadLimiter(LADSPA_Handle instance) {
#line 188 "fast_lookahead_limiter_1913.xml"
Det är troligt att den "någon annan" som skrivit C-koden inte är en människa utan ett program. I så fall ett program som konverterar innehållet i en xml-fil till C-kod. Såna program brukar lägga in "#line" så att felmeddelanden från C-kompilatorn kommer att hänvisa till filnamn och radnummer i xml-filen i stället för C-filen.

Har du xml-filen? Är den skriven av en människa?
Jag har filen, men om den är skriven av en människa eller inte vet jag inte. Skulle kunna vara… men rent spontant känns det nog mer som att den är skriven i någon WYSIWYG-XML-redigerare som i sin tur släppt ifrån sig en XML-fil och en XSLT-fil, men vad vet jag?
Men någon större konvertering lär inte behövas i alla fall, för XML-filen innehåller ju C-koden mer eller mindre i klartext i stora sjok, blandat med annat innehåll, främst text.