Extern használata

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Extern használata

Hozzászólás Szerző: kapu48 »

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Extern használata

Hozzászólás Szerző: kapu48 »

A programozás alapjai - InfoC - Budapesti Műszaki és ... https://infoc.eet.bme.hu/jegyzet/c_jegyzet.pdf
67. oldal: 21.2 A C programok általános felépítése

Még több: https://www.google.hu/search?client=ope ... 91knek+pdf
Avatar
SanyiSay
Elektronbűvölő
Hozzászólások: 1031
Csatlakozott: 2009. február 28. szombat, 7:00

Re: Extern használata

Hozzászólás Szerző: SanyiSay »

Lehet teljesen süketséget írok és nem is ide tartozik, akkor bocsi.

Én mikor több fájlra kezdtem bontani a kódomat, azóta a fájlok elejére be kell tennem a

Kód: Egész kijelölése

#pragma once
sort és onnantól kezdve simán fordult és működik minden. Mindenki látott mindenkit. Van hogy egy netről leszedett lib is hibával fordul a még nem írogatom bele.
Egyszerűbb "libeket" írogatok magamnak a morse minta alapján.
https://www.arduino.cc/en/Hacking/LibraryTutorial
Nagyon praktikus megoldás. :)

Externt viszont még sosem írtam a kódomba, fordítónak ugyan eclipse arduino-t használok, ami lehet sok mindent megold helyettem.
Avatar
csabeszq
Bitfaragó
Hozzászólások: 678
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: Extern használata

Hozzászólás Szerző: csabeszq »

Találkoztál a C szépségeivel.

Az #pragma nem szabványos fordító utasítás, ne használd. Ha szabványos C-ben meg tudod írni, az mindig jobb.

Az alap probléma: valahogy kétszer #include-olsz valamit.

Kód: Egész kijelölése

#include "programom.h"
#include "programom.h"
A programom.h meg szerencsésen deklarációt is tartalmaz:

Kód: Egész kijelölése

int alma = 5;
A preprocesszor ezt arra fordítja le, hogy:

Kód: Egész kijelölése

int alma = 5;
int alma = 5;
Ezután meg pampog, hogy az alma már egyszer deklarálva lett.

Ezután beállítasz a header-ben egy tök nem szabványos direktívát: #pragma once, aminek köszönhetően a második #include el lesz dobva. Feltéve, ha olyan fordítóval dolgozol, ami az #pragma once-ot ismeri. A gcc 3.4-től támogatja, előtte nem volt ilyen.

A megoldás, a C-s matyóhímzés rendes megtanulása, amit mindenki mindig csinál, ha header fájlt hoz létre (nem gondolkodsz, matyóhímzéssel kezdesz):

Kód: Egész kijelölése

#ifndef __PROGRAMOM_H__  /* ha még nincs __PROGRAMOM_H__ akkor hajtsuk végre ezt az ágat */
#define __PROGRAMOM_H__  /* itt definiáljuk a __PROGRAMOM_H__-t */

int alma = 5;

#endif /* __PROGRAMOM_H__ */ /* itt ér véget a matyóhímzés */
Miután a __PROGRAMOM_H__ bűvészkedést megcsináltad, az #include-ot annyiszor hívod, amennyiszer jólesik, viszont csak az első esetben fog csinálni valamit.

Kód: Egész kijelölése

#include "programom.h"
#include "programom.h"
#include "programom.h"
Ezt komolyan ráolvasásként kell megtanulni. Életemben nem írtam még olyan header fájlt, amiből az #ifndef varázslat kimaradt volna. Nem kell gondolkodni, ész nélkül elmormolod a header fájlok csodaszavait és minden menni fog. :)
Avatar
SanyiSay
Elektronbűvölő
Hozzászólások: 1031
Csatlakozott: 2009. február 28. szombat, 7:00

Re: Extern használata

Hozzászólás Szerző: SanyiSay »

csabeszq írta:Ha szabványos C-ben meg tudod írni, az mindig jobb.
Efféle egysoros intéseket olvastam fórumokon is, de eddig nem állt össze mi a gond, hiányzott az a pár sor amit hozzá tettél. Annyi minden tanulni való van, hogy ha valami működik azt inkább nem bolygatom, ha nem értem teljesen.
Most már értem. Köszönöm.

Legalább nem unatkozok még kijavítok mindent. :)
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Re: Extern használata

Hozzászólás Szerző: kapu48 »

Ha hordozható álományt akarsz, C, Cpp-hez?
Akkor még kiegészítet ezzel a feltételes fordítással:

Kód: Egész kijelölése


#ifndef __PROGRAMOM_H__  /* ha még nincs __PROGRAMOM_H__ akkor hajtsuk végre ezt az ágat */
#define __PROGRAMOM_H__  /* itt definiáljuk a __PROGRAMOM_H__-t */

#ifdef __cplusplus
 extern "C" {
#endif 


int alma = 5;



#ifdef __cplusplus
}
#endif

#endif /* __PROGRAMOM_H__ */ /* itt ér véget a matyóhímzés */

Avatar
SanyiSay
Elektronbűvölő
Hozzászólások: 1031
Csatlakozott: 2009. február 28. szombat, 7:00

Re: Extern használata

Hozzászólás Szerző: SanyiSay »

kapu48 írta:Ha hordozható álományt akarsz, C, Cpp-hez?
Hordozhatósággal nem szeretnék foglalkozni, de a tapasztalat meg azt mondja, hogy ami egyszer szóba került az kelleni is fog előbb utóbb. :D
Úgyhogy ezt is köszönöm.
Avatar
csabeszq
Bitfaragó
Hozzászólások: 678
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: Extern használata

Hozzászólás Szerző: csabeszq »

Az #pragma once-ról:

Egyáltalán nincs róla a neten egységes vélemény. Annyit érdemes tudni, hogy nem része a szabványnak, a fordítók nagy része viszont de facto támogatja.

Én a szabványos cuccok híve vagyok, de valahol mindenki érzi, hogy az #ifndef-es ökörködés hát nem túl szép.

Az #pragma once majdnem ugyanazt csinálja, mint az ifndef.

Amíg szabványos nem lesz, én nem fogom használni.
Avatar
SanyiSay
Elektronbűvölő
Hozzászólások: 1031
Csatlakozott: 2009. február 28. szombat, 7:00

Re: Extern használata

Hozzászólás Szerző: SanyiSay »

csabeszq írta:Egyáltalán nincs róla a neten egységes vélemény.
Effélét tapasztaltam és is.

Na de most már rendeztem soraim. Matyóhímzés pipa. :)
Válasz küldése