Vad ' är skillnaden mellan #define och const int när deklarerar en pin? [duplicera]

<åt sidan class = "s-notice s-notice__info js-post-notice mb16" role = "status">

Denna fråga har redan svar här :

Kommentarer

  • Jag antar att du menar #define istället för #include. Det mer professionella sättet att deklarera stift är const int myPin = ... Detta hjälper kompilatorn att förstå att det är ett konstant värde och att lagring inte krävs. Detta är något bättre än #define eftersom det ger sammanställningsinformationen om datatypen.
  • @MikaelPatel exakt … så i princip int -metoden är bättre?
  • Ja. Uppdatera titeln och ta bort " inkludera ". Det är något helt annat och inte relaterat 🙂
  • Jag brukar föredra att använda enum för heltal eller teckenkonstanter snarare än antingen #define eller const int. Se accepterat svar på Är det bättre att använda #define eller const int för konstanter? ,

Svar

”#define” är ett förbehandlingsdirektiv. Den definierar en etikett och ett värde som kommer att placeras i den förbehandlade källkoden på samma plats för varje förekomst av etiketten. Ingen typ definieras, så det är en grundläggande och dum ersättning av strängar före kompilering. Det kan sedan leda till fel eller missförstånd under kompileringen.

”const int xxx” definierar en typ och låser värdet för den instansen. Det är säkrare att använda den här metoden. Kompilatorn kan kontrollera typfel och kasta meddelanden (eller bryta sammanställning) om du gjorde ett misstag.

Exempel:

#define A 5 int dummy_integer = A 

… kommer att förbehandlas som …

int dummy_integer = 5 

… och kompilatorn kommer att läsa detta uttalande.

Men om jag kommer ihåg bra kan du alltid skriva över ett förbehandlingsdirektiv enligt följande:

#define A 5 int dummy_integer = A //some code here #undef A #define A "my_string" std::cout << A 

Det är inte bra. Genom att använda modifieraren ”const” kan du istället inte ändra värdet (eller typen) för en variabel (och så definieras den ”konstant”).

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *