Rozdíl v definici typů #define a typedef – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Rozdíl v definici typů #define a typedef – C / C++ – Fórum – Programujte.comRozdíl v definici typů #define a typedef – C / C++ – Fórum – Programujte.com

 

Boblig0
Newbie
21. 10. 2020   #1
-
0
-

Jaký je rozdíl mezi těmito definicemi? Obojí se zdá, že funguje stejně i výstup z kompilátoru je shodný. Díky

typedef unsigned char uint8_t ;
typedef unsigned short uint16_t; 

#define uint8_t unsigned char
#define uint16_t unsigned short
Nahlásit jako SPAM
IP: 176.98.110.–
Kit+15
Guru
21. 10. 2020   #2
-
0
-

#1 Boblig
U takhle primitivního příkladu to vypadá stejně, ale není to stejné. O makra se stará preprocesor, o typedef kompilátor.

Nahlásit jako SPAM
IP: 46.135.69.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
21. 10. 2020   #3
-
0
-

Typedef se da schovat do namespace nebo do tridy (v C to samozrejme neni).

Makro je proste videt vsude od jeho definice a nahrazuje se ciste jako text za text. Kdyz pak nekdo udela nejake opravdu kolizni makro (jako treba max, co bylo nekde ve woknouzich hlavickach), tak se vsichni strasne divili ze jim std::max moc nefacha.

V novejsich specifikacich C++ se taky preferuje pouziti using.. tj.   using uint8_t = unsigned char;  nicmene tyhle typy bych neresil, jsou uz vsechny v  cstdint / stdint.h

Nahlásit jako SPAM
IP: 78.80.26.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Boblig0
Newbie
24. 10. 2020   #4
-
0
-

#3 KIIV
Děkuji za odpověď, náhodou sem se dostal k prostředí Keil uVision pro jednočipy 8051, kde potřebuji provést nějaké úpravy po kolegovi a zjistil sem, že tyto zkrácené tvary nefungují což mě překvapilo a narazil sem právě na ty dvě možnosti definic, tak mě zajímal rozdíl. Každopádně důvod je v tom, že Keil neobsahuje knihovnu stdint.h (cstdint.h). 

Nahlásit jako SPAM
IP: 176.98.110.–
JerryM0
Věrný člen
25. 10. 2020   #5
-
0
-

programování jednočipů je jiné než klasické 8086 procesory.

bohužel budeš si muset pořídit knížku Assembler 8051.

https://www.keil.com/support/man/docs/c51/c51_library.htm

v žádném případě NEPOUZIVEJ záměnu  typedef  a  #define protože u jednočipu je to jiné

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:61d9:acb7:835b:9efc...–
gna
~ Anonymní uživatel
1891 příspěvků
25. 10. 2020   #6
-
0
-

#5 JerryM
v žádném případě NEPOUZIVEJ záměnu  typedef  a  #define protože u jednočipu je to jiné

Není.

Nahlásit jako SPAM
IP: 213.211.51.–
26. 10. 2020   #7
-
0
-

Pokud programuje v C/C++ není znalost Assembleru nutná ani u jednočipu. Knížku? Nejlepší byl 8051 hardware manual od Atmelu (dnes Microchip). Na naučení Assembleru je nejlepší mít instrukční sadu, překladač, simulátor a chuť si s tím pohrát.

Kdysi jsem se naučil pravidlo: nikdy nezaměňuj typedef a #define, protože bramboračku mám rád na talíři, v programování nikoliv.

Na rozdíly v použíání typedef a #define jsem nenarazil ani u 8051 ani u AVR

hu

Nahlásit jako SPAM
IP: 2001:af0:ffe4:85f4:1ddd:b432:e6a1:a1bd...–
JerryM0
Věrný člen
26. 10. 2020   #8
-
0
-

#1 Boblig
to sou věci co se řeší už desítky let

https://stackoverflow.com/questions/1666353/are-typedef-and-define-the-same-in-c

a pořád na ně padaj stejný odpovědi

https://aticleworld.com/typedef-vs-define-in-c/

https://www.codegrepper.com/code-examples/c/typedef+vs+%23define

a samozřejmě z toho vyplývaj stejný problémy

http://www.firmcodes.com/difference-between-typedef-and-define/

https://www.ritambhara.in/difference-between-typpedef-and-define/

uplně stačí do Googlu zadat heslo "typedef vs define" ...

přiznám se, že mě nikdy nenapdalo zaměňovat ty dva výrazy

vem si, že třeba v Basicu je příkaz

SELECT CASE testovanahodnota

      CASE A=1

END SELECT

a přitom mezi CASE A=1 a SELECT CASE lze vložit další příkazy ale v manuálu to neni a pro určité typy překladačů to způsobí nepředvídatelné chování ... ale .... někdo to používá :)

z neuvážené záměny typedef a define vyplývaj jistá omezení a problémy

https://www.ritambhara.in/difference-between-typpedef-and-define/

v dřívějších učebnicích C pro 8048/8096 a 8051 byly detailě rozebírané i jednotlivé kroky při práci kompilátoru formou syntaktických diagramů (typicky to měl původní manál Intelu) ale teď už se to neuvádí ...

nicméně asi by se to někde na stránkách Intelu dalo dohledat ale nevim kde

když programuješ jen v céčku měl bys dodržovat standardní konvence jazyka

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:580d:fa53:774d:b0d3...–
Josef_H
~ Anonymní uživatel
1 příspěvek
29. 10. 2020   #9
-
0
-

#7 hlucheucho
Asi úplně nutná není, ale pro práci s 8051 velmi žádoucí, protože o ASM se většinou opírajají i datasheety mnoha výrobců a pokud potřebuji rozchodit nějakou složitější perifeii, tak můžu mít problém. Kolega se takhle pokoušel rozchodit řadič externí RAM v C a nepodařilo se mu to, zatímco v ASM díky rozsáhlému examplu v Application notes ano a vlastně ani neví jak ta low level úroveň přesně funguje.

Nahlásit jako SPAM
IP: 178.17.11.–
KIIV
~ Moderátor
+43
God of flame
3. 11. 2020   #10
-
0
-

#9 Josef_H
Neni u 8051 extmem jen o tom pouzit spravne instrukce (a mit ji samozrejme spravne pripojenou), mozna jde neprimo pouzit i s normalnima instrukcema, nestudoval sem to.

Ostatne jde jen zmenou stavu jednoho pinu i prepnout na program v externi pameti od adresy 0x0000. Bez toho je k dispozici az pokud se pouzije adresa za interni pameti.

U Atmega2560 se dala externi pamet pripojit taky vcelku jednoduse, stacilo par nastaveni v registrech a udelat si pointer za interni pamet. Pokud bych do ni ale chtel ukladat i promenne nebo stack, musel bych v C upravit linker scripty a nadefinovat kolik mista tam je a tak.

No kazdopadne neni spatne se trochu rozhlednout v Asm, ale pokud clovek chce opravdu neco naprogramovat, tak je lepsi C nebo C++. Neni to zase tak moc daleko od Asm.

Nahlásit jako SPAM
IP: 89.24.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 45 hostů

Podobná vlákna

Význam #define a typedef — založil Zutent

Typedef v C ? — založil Berger

List v definici funkce — založil Abi Poe

Problém s definicí tříd — založil yaqwsx

Typedef void* ve VB.NET — založil Štefan Kakaš

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý