Enkel liten variabel fråga
Enkel liten variabel fråga
Om min kod består av flera .C filer och jag vill komma åt en variabel från två olika funktioner som finns i två olika .C-filer. Hur gör jag då?
Jag måste ju deklarera variabeln i någon fil, och gör jag det i den ena så kommer inte den andra åt och tvärt om.
Jag måste ju deklarera variabeln i någon fil, och gör jag det i den ena så kommer inte den andra åt och tvärt om.
Gäller "virtual" oberoende av *vilken* C-kompilator man använder ?
"Global/Extern" är annars en annan variant som t.ex används i assembler...
Hur som helst, kolla upp vad dokumentationen säger om att deklarera
variabler så att de syns "globalt" samt att de är definierade "externt".
Vilken C variant är det ?
"Global/Extern" är annars en annan variant som t.ex används i assembler...
Hur som helst, kolla upp vad dokumentationen säger om att deklarera
variabler så att de syns "globalt" samt att de är definierade "externt".
Vilken C variant är det ?
MikroC.
Det gick bra att bara definiera variablerna i "huvudfilen" och sedan skriva extern framför definitionen i den andra filen.
Dvs i fil1.c
unsigned char variablename;
fil2.c
extern unsigned char variablename;
Får dock en anmärkning vid kompileringen:
initialization of extern object variablename
EDIT: Fixade stavfel som vanligt..
Det gick bra att bara definiera variablerna i "huvudfilen" och sedan skriva extern framför definitionen i den andra filen.
Dvs i fil1.c
unsigned char variablename;
fil2.c
extern unsigned char variablename;
Får dock en anmärkning vid kompileringen:
initialization of extern object variablename
EDIT: Fixade stavfel som vanligt..
Hm, "static" har väl med hur variablen "hanteras", inte på vilket dsätt
de den "syns" från andra delar av koden ? Det är ju två olika saker.
D.v.s att värdet sparas mellan anropen och att adressen inte används
av andra variabler i andra delar av koden.
Eller så har jag missförstått "static", vilket inte är osannolikt...
de den "syns" från andra delar av koden ? Det är ju två olika saker.
D.v.s att värdet sparas mellan anropen och att adressen inte används
av andra variabler i andra delar av koden.
Eller så har jag missförstått "static", vilket inte är osannolikt...

Brukar göra så här:
Skapar en .h fil för alla globala variabler, sedan ser det ut så här:
var.h
Sedan i .c-filen där main() finns lägger jag in:
Sedan inkluderar jag var.h i samtliga .c-filer som ingår i projektet.
På detta sätt får jag samtliga globala variabler deklarerade i "huvudfilen" och definerade i efterföljande filer. (hmm eller är det tvärt om deklarerade/definerade).
I vilket fall som helst så talar "extern" om för kompilatorn att plats skall reserveras för att använda dessa globala variabler i samtliga filer.
Skapar en .h fil för alla globala variabler, sedan ser det ut så här:
var.h
Kod: Markera allt
/*var.h*/
#ifdef MAIN_APP
#define EXTERNAL
#else
#define EXTERNAL extern
#endif
#ifndef _VARS_H
#define _VARS_H
EXTERNAL unsigned char variable;
#endif
Kod: Markera allt
#define MAIN_APP
#include "var.h"
På detta sätt får jag samtliga globala variabler deklarerade i "huvudfilen" och definerade i efterföljande filer. (hmm eller är det tvärt om deklarerade/definerade).
I vilket fall som helst så talar "extern" om för kompilatorn att plats skall reserveras för att använda dessa globala variabler i samtliga filer.
Du har inte helt fel, deklarerar du en static så behåller den värdet mellan anropen.sodjan skrev:Eller så har jag missförstått "static", vilket inte är osannolikt...
Deklarerar du en static variabel globalt så har den bara räckvidd inom filen, d.v.s. du kommer inte åt den i andra filer så som du gör med en global variabel genom att använda nyckelordet extern i C brukar man inte (i Ansi) ange global utan den blir det automatiskt om den ligger utanför en funktion om den inte är static, denna variable komma man åt i andra filer genom att ange nyckelordet extern i den aktuella fil som skall använda den globala variabeln.
Virtual är ett nyckelord i C++, används för att göra en metod dynamisk länkande.
Nja, inte riktigt. På de ställen där du deklarerat en variabel som extern så kommer det inte att reserveras minne. Extern talar om att det inför länkningen finns minne reserverat av någon annan c-fil (den som inte är deklarerad som extern).TomasL skrev:I vilket fall som helst så talar "extern" om för kompilatorn att plats skall reserveras för att använda dessa globala variabler i samtliga filer.
Att, som du föreslår, skapa en .h-fil med globala variabler är inte smart när projekten växer. Om du t.ex. döper om en variabel i som bara används i ett par .c-filer så kommer ALLA .c-filer kompileras om eftersom .h-filen finns med i alla c-filer. (Visst, går att lösa med make-filen men bäst är att låta bli onödig globalisering)
Det är tvärtom.TomasL skrev:
Sedan inkluderar jag var.h i samtliga .c-filer som ingår i projektet.
På detta sätt får jag samtliga globala variabler deklarerade i "huvudfilen" och definerade i efterföljande filer. (hmm eller är det tvärt om deklarerade/definerade).
Om man inte vet det kan det vara bra att känna till följande om C: Det är skillnad på deklaration och definition. En deklaration talar om tex att en int finns, en definition reserverar minne. Inte helt intuitivt särskilt med tanke på att preprocessorn har direktivet #define som är ngt annat

Nej. extern är en deklaration som talar om för kompilatorn att variabeln finns och är definierad någon annanstans. Men det var väl så du menade?TomasL skrev: I vilket fall som helst så talar "extern" om för kompilatorn att plats skall reserveras för att använda dessa globala variabler i samtliga filer.
Dessutom har extern en annan betydelse när den står framför en funktionsdeklaration. (Ingen alls.)
JJ: "Men det var väl så du menade?" Jupp.
oJsan: "Att, som du föreslår, skapa en .h-fil med globala variabler är inte smart när projekten växer.": Just för Globala variabler som spänner över hela projektet ser jag inga problem med detta.
Fördelen är ju att alla variabler finns på samma ställe och man får då en rätt bra överblick över det hela.
Dock, av naturliga skäl gör jag inte så med "bibliotekskod", de har egna .h filer
oJsan: "Att, som du föreslår, skapa en .h-fil med globala variabler är inte smart när projekten växer.": Just för Globala variabler som spänner över hela projektet ser jag inga problem med detta.
Fördelen är ju att alla variabler finns på samma ställe och man får då en rätt bra överblick över det hela.
Dock, av naturliga skäl gör jag inte så med "bibliotekskod", de har egna .h filer