C Academy · Oppitunti

Ehdollinen käännös

ifdef ja makrot.

Oppitunti 1/413 vaihetta

Ehdollinen käännös on ilmainen C Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu C Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C Academy-kurssilla on yhteensä 4 oppituntia.

Esikääntäjä

Ennen kuin kääntäjä näkee koodinne, esikääntäjä suoritetaan. Se käsittelee kaikki #-merkillä alkavat rivit: sisällytykset, makrot ja ehdot.

Ehdollisen käännöksen avulla koodilohkoja voi sisällyttää tai jättää pois tässä vaiheessa arvioitavien ehtojen perusteella. Näin yhdestä lähdekoodista voidaan tuottaa erilaisia koontiversioita.

Makrojen määrittäminen

#define luo makron. Ilman arvoa se on pelkkä lippu, jonka tilan voi tarkistaa myöhemmin.

Objektimaiset makrot korvaavat nimen tekstillä; liput ainoastaan merkitsevät, että jokin on määritelty.

#define MAX_USERS 100   /* value macro */
#define DEBUG          /* flag macro */

ifdef ja ifndef

#ifdef NAME säilyttää lohkon vain, jos NAME on määritelty. #ifndef säilyttää sen vain, jos NAME ei ole määritelty.

Tässä virheenkorjaustulostus on olemassa vain debug-koonneissa. Jos DEBUG-makroa ei ole määritelty, kääntäjä ei edes näe kyseistä riviä.

#include <stdio.h>
#define DEBUG

int main(void) {
#ifdef DEBUG
    printf("debug: starting\n");
#endif
    printf("running\n");
    return 0;
}

if, elif, else

#if arvioi vakioarvoisen kokonaislukulausekkeen. Yhdistäkää siihen #elif ja #else monisuuntaista valintaa varten.

Näin koodi valitaan versionumeromakron perusteella.

#include <stdio.h>
#define VERSION 2

int main(void) {
#if VERSION >= 2
    printf("new feature on\n");
#else
    printf("legacy mode\n");
#endif
    return 0;
}

defined-operaattori

#if-direktiivin sisällä voitte tarkistaa määrittelyn käyttämällä defined(NAME)-ehtoa ja yhdistää tarkistuksia operaattoreilla && ja ||.

Tämä on joustavampaa kuin #ifdef, jolla voi tarkistaa vain yhden nimen.

#if defined(LINUX) && !defined(EMBEDDED)
    /* desktop Linux code */
#endif

Määrittäminen käännöshetkellä

Makroja ei tarvitse kirjoittaa kiinteästi lähdekoodiin. -D-valitsin määrittää ne komentorivillä.

Näin koontijärjestelmät voivat vaihtaa ominaisuuksia muokkaamatta lähdekoodia. -DDEBUG vastaa sitä, että jokaisen tiedoston alussa olisi #define DEBUG.

gcc -DDEBUG -DVERSION=3 -o app app.c

Alustan tunnistaminen

Kääntäjät määrittelevät valmiiksi kohdealustaa kuvaavia makroja. Niiden avulla voitte kirjoittaa siirrettävää koodia.

  • _WIN32 — Windows (32- tai 64-bittinen)
  • __linux__ — Linux
  • __APPLE__ — macOS / iOS

Valitkaa näiden perusteella oikea alustan ohjelmointirajapinta.

#ifdef _WIN32
    #include <windows.h>
#else
    #include <unistd.h>
#endif

Otsikkotiedostojen include-suojaukset

Ehtojen perinteinen käyttötapa on include-suojaus, joka estää otsikkotiedoston käsittelyn kahdesti.

Ensimmäinen sisällytys määrittää suojamakron; myöhemmät sisällytykset ohittavat rungon, koska makro on jo määritelty.

#ifndef UTILS_H
#define UTILS_H

int add(int a, int b);

#endif /* UTILS_H */

Koodin kommentointi pois käytöstä

#if 0 ... #endif poistaa lohkon käytöstä luotettavasti, vaikka lohko sisältäisi jo kommentteja.

Toisin kuin /* */, se voidaan turvallisesti upottaa toisen samanlaisen rakenteen sisään, joten se on vakiotapa jättää koodia tilapäisesti pois virheenkorjauksen aikana.

#if 0
    legacy_function();   /* disabled for now */
    /* with internal comments too */
#endif

Esikääntäjän tulosteen tarkastelu

Nähdäksesi täsmälleen, mitä kääntäjä kääntää, suorita vain esikääntäjä valitsimella -E.

Se laajentaa kaikki sisällytykset, makrot ja ehdot. Tämä on erittäin hyödyllistä, kun makro ei toimi odotetusti.

gcc -E app.c | less

Ominaisuuksien kytkimet käytännössä

Yleinen toimintatapa on käyttää yhtä asetusten otsikkotiedostoa, jolla ominaisuuksia otetaan käyttöön tai poistetaan käytöstä koko projektissa.

Yhden #define-määrittelyn vaihtaminen vaikuttaa kaikkiin suojattuihin lohkoihin kaikissa tiedostoissa. Näin valinnaiset ominaisuudet pysyvät selkeästi erillään ydinkoodista.

#include <stdio.h>
#define FEATURE_LOGGING 1

int main(void) {
#if FEATURE_LOGGING
    printf("logging enabled\n");
#endif
    printf("app ready\n");
    return 0;
}

Pikatarkistus

Ennustakaa komentorivimäärittelyn toiminta.

Kertaus

Hallitsette nyt ehdollisen käännöksen:

  • #ifdef/#ifndef tarkistavat, onko makro määritelty
  • #if/#elif/#else arvioivat vakioarvoisia lausekkeita yhdessä defined()-ehdon kanssa
  • -DNAME määrittää makroja komentoriviltä ominaisuuksien vaihtamista varten
  • Valmiiksi määritellyt alustamakrot mahdollistavat siirrettävän koodin, ja include-suojaukset estävät kaksoissisällytykset

Seuraavaksi: koodin järjestäminen useisiin tiedostoihin.

Aloita maksutta

Opi C tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
39
Oppitunnit
144

Usein kysytyt kysymykset

Onko oppitunti ”Ehdollinen käännös” ilmainen?

Kyllä – oppitunnin ”Ehdollinen käännös” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko C Academy-kurssin, päivitä CoddyKit PROhon. C Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Ehdollinen käännös”?

ifdef ja makrot. Harjoittelet C Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni C Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin C Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”Ehdollinen käännös”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä C Academy-oppitunnilla?

Kyllä. Jokainen C Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Ehdollinen käännös
  2. Monitiedostoprojektit
  3. Makefile-tiedostot
  4. Staattiset ja jaetut kirjastot
← Takaisin: C Academy