Risolto Undescored keyword a cosa servono esattamente?

giovy2707

Utente Electrum
27 Giugno 2019
96
38
62
103
Da quanto ho potuto leggere in giro e da quanto mi ha detto ChatGPT le keyword che iniziano con _ come ed esempio _Bool sono utilizzate per scopi futuri, tipo modificare le funzionalità assegnate ad esse nelle future versioni del linguaggio ecc... però non è che abbia capito bene la logica che c'è dietro.

Qualcuno mi potrebbe spiegare meglio come funzionano?
 
Non c'è nessuna logica particolare, vale un po' il discorso che ho fatto in questo post. Quando hanno inventato il C non hanno ritenuto importante avere un tipo bool per fare operazioni di algebra booleana, praticamente la parola bool non aveva nessun significato speciale, questo vuol dire che era lecito scrivere una cosa di questo tipo
C:
int main() {
    int bool = 1;
    if (bool) {
        printf("true\n");
    } else {
        printf("false\n);
    }
    return 0;
}
Qualche anno dopo hanno cambiato idea: "il tipo bool con true e false ci starebbero proprio bene nel linguaggio C". Se avessero introdotto questo cambiamento io, che non mi tengo aggiornato sui cambiamenti dello standard, non riuscirei più a compilare il programma che ti ho appena scritto.

Come possono fare per introdurre il tipo booleano senza creare nessun disagio? Quando hanno definito lo standard sono stati abbastanza previdenti e hanno detto che tutte le parole che iniziano per _ (underscore) seguito da una lettera maiuscola sono riservate. Ovvero, int _Pippo = 1; non è un codice valido in C perché non ti è consentito usare underscore + lettera maiuscola per dare un nome alle variabili, alle funzioni, o a qualsiasi altra cosa. Con lo standard del 1999 hanno il tipo _Bool. L'hanno chiamato in questo modo orribile (underscore + maiuscola) perché sapevano che non avrebbero infastidito nessuno: int _Bool = 1; era ed è illegale esattamente come lo è int _Pippo = 1;. Usando questo tipo potremmo riscrivere il nostro codice in questo modo
C:
int main() {
    _Bool bool = 1;
    if (bool) {
        printf("true\n");
    } else {
        printf("false\n);
    }
    return 0;
}

Bello schifo. Perché il tipo per gli interi si chiama int, il tipo per i floating point si chiama float, quello per i floating point a doppia precisione di chiama double, mentre il tipo per i booleani si chiama _Bool? Sarebbe molto più bello se il tipo si chiamasse bool. E infatti _Bool non dovresti usarlo mai. Il modo più giusto per riscrivere il nostro codice è questo
C:
#include <stdbool.h>
int main() {
    bool flag = true; // nota: ho dovuto cambiare nome alla variabile
    if (flag) {
        printf("true\n");
    } else {
        printf("false\n);
    }
    return 0;
}
Hanno creato un header file che nasconde la porcata (i.e., usare il nome _Bool invece di bool) che sono stati costretti a fare per permettermi di compilare il primo codice che ti ho scritto. Se voglio stare al passo con i tempi dovrò modificare i miei programmi per usare bool invece che int, altrimenti, se sono pigro, posso non modificare niente e continuare ad usare il primo codice. Se avessero usato direttamente bool senza fare sta mezza porcata di usare _Bool, io sarei stato costretto a modificare il mio codice: avrebbero rotto la retrocompatibilità.
 
  • Incredibile
Reazioni: giovy2707
Non c'è nessuna logica particolare, vale un po' il discorso che ho fatto in questo post. Quando hanno inventato il C non hanno ritenuto importante avere un tipo bool per fare operazioni di algebra booleana, praticamente la parola bool non aveva nessun significato speciale, questo vuol dire che era lecito scrivere una cosa di questo tipo
C:
int main() {
    int bool = 1;
    if (bool) {
        printf("true\n");
    } else {
        printf("false\n);
    }
    return 0;
}
Qualche anno dopo hanno cambiato idea: "il tipo bool con true e false ci starebbero proprio bene nel linguaggio C". Se avessero introdotto questo cambiamento io, che non mi tengo aggiornato sui cambiamenti dello standard, non riuscirei più a compilare il programma che ti ho appena scritto.

Come possono fare per introdurre il tipo booleano senza creare nessun disagio? Quando hanno definito lo standard sono stati abbastanza previdenti e hanno detto che tutte le parole che iniziano per _ (underscore) seguito da una lettera maiuscola sono riservate. Ovvero, int _Pippo = 1; non è un codice valido in C perché non ti è consentito usare underscore + lettera maiuscola per dare un nome alle variabili, alle funzioni, o a qualsiasi altra cosa. Con lo standard del 1999 hanno il tipo _Bool. L'hanno chiamato in questo modo orribile (underscore + maiuscola) perché sapevano che non avrebbero infastidito nessuno: int _Bool = 1; era ed è illegale esattamente come lo è int _Pippo = 1;. Usando questo tipo potremmo riscrivere il nostro codice in questo modo
C:
int main() {
    _Bool bool = 1;
    if (bool) {
        printf("true\n");
    } else {
        printf("false\n);
    }
    return 0;
}

Bello schifo. Perché il tipo per gli interi si chiama int, il tipo per i floating point si chiama float, quello per i floating point a doppia precisione di chiama double, mentre il tipo per i booleani si chiama _Bool? Sarebbe molto più bello se il tipo si chiamasse bool. E infatti _Bool non dovresti usarlo mai. Il modo più giusto per riscrivere il nostro codice è questo
C:
#include <stdbool.h>
int main() {
    bool flag = true; // nota: ho dovuto cambiare nome alla variabile
    if (flag) {
        printf("true\n");
    } else {
        printf("false\n);
    }
    return 0;
}
Hanno creato un header file che nasconde la porcata (i.e., usare il nome _Bool invece di bool) che sono stati costretti a fare per permettermi di compilare il primo codice che ti ho scritto. Se voglio stare al passo con i tempi dovrò modificare i miei programmi per usare bool invece che int, altrimenti, se sono pigro, posso non modificare niente e continuare ad usare il primo codice. Se avessero usato direttamente bool senza fare sta mezza porcata di usare _Bool, io sarei stato costretto a modificare il mio codice: avrebbero rotto la retrocompatibilità.
Risposta chiarissima, grazie mille