Scrivere un programma che stamperà “C”, se calcolata come (ANSI) Programma C, e “C ++”, se compilato come un programma C ++

StackOverflow https://stackoverflow.com/questions/2038200

  •  19-09-2019
  •  | 
  •  

Domanda

http://www.ocf.berkeley.edu/~ WWU / indovinelli / cs.shtml

Sembra molto compilatore specifico per me. Non so dove cercare?

È stato utile?

Soluzione

abbastanza semplice.

#include <stdio.h>
int main(int argc, char ** argv) {
#ifdef __cplusplus
printf("C++\n");
#else
printf("C\n");
#endif
return 0;
}

O c'è un obbligo di fare questo senza lo standard ufficiale?

Altri suggerimenti

Abbiamo dovuto fare un compito simile a scuola. Non ci era permesso di usare preprocessore (tranne che per #include naturalmente). Il codice seguente utilizza il fatto che in C, i nomi dei tipi e nomi di struttura formano spazi dei nomi separati, mentre non in C ++ che fanno.

#include <stdio.h>
typedef int X;
int main()
{
    struct X { int ch[2]; };
    if (sizeof(X) != sizeof(struct X))
        printf("C\n");
    else
        printf("C++\n");
}

So di 7 approcci:

1. Abuso C ++ typedefs automatiche

(Si noti che la struct deve essere dichiarato in un ambito interno in modo che esso ha la precedenza sul nome esterno in C ++.)

char x;
{
    struct x { char dummy[2]; };
    printf("%s\n", sizeof (x) == 1 ? "C" : "C++");
}

Una versione simile che non si basa sulla ambiguità tra sizeof (type) e sizeof (variable), utilizzando solo i tipi:

typedef char t;
{
    struct t { char dummy[2]; };
    printf("%s\n", sizeof (t) == 1 ? "C" : "C++");
}

2. Abuso C ++ struct / class di equivalenza, typedefs automatici, e costruttori predefiniti generati automaticamente

/* Global*/
int isC = 0;
void Foo() { isC = 1; }

/* In some function */
struct Foo { int dummy; };
Foo();
printf("%s\n", isC ? "C" : "C++");

3. Abuso annidati dichiarazioni struct in C

Simbolo scontrandosi di struct interni ed esterni , C ++ vs C

typedef struct inner { int dummy; } t;
{
    struct outer { struct inner { t dummy[2]; } dummy; };
    printf("%s\n",
           sizeof (struct inner) == sizeof (t)
           ? "C++"
           : "C");
}

4. commenti Abuso //

Questo non funzionerà con C99 o C89 con i compilatori che supportano // come estensione.

printf("%s\n",
       0 //* */
       +1
       ? "C++"
       : "C");

o, in alternativa:

printf("s\n",
       1 //* */ 2
       ? "C++"
       : "C");

5. differenze sizeof con letterali char

Si noti che questo non è sempre garantito portatile poiché è possibile che alcuni piattaforma ipotetico potrebbe usare byte con più di 8 bit, nel qual caso sizeof(char) potrebbe essere la stessa come sizeof(int). (Vedi anche Can sizeof (int) mai essere 1 su un hosting implementazione? )

printf("%s\n", sizeof 'a' == 1 ? "C++" : "C");

6. differenze abuso In quando vengono eseguite conversioni lvalue⇒rvalue

Questa è basato fuori del 5.16, 5.17, 5.18 esempio nella ISO C ++ standard di 03, e funziona in GCC, ma non in MSVC (forse a causa di un errore del compilatore?).

void* array[2];
printf("%s\n",
       (sizeof (((void) 0), array) / sizeof (void*) == 1)
       ? "C"
       : "C++");

7. differenze abusi nel modo in cui le grammatiche C e C ++ s 'analizzare l'operatore ternario

Questo non è strettamente giuridico, ma alcuni compilatori sono lassista.

int isCPP = 1;
printf("%s\n", (1 ? isCPP : isCPP = 0) ? "C++" : "C");

(È inoltre possibile controllare per la macro __cplusplus preprocessore (o varie altre macro), ma penso che non segue lo spirito della questione.)

Ho implementazioni per tutti questi a: http://www.taenarum.com/csua/ fun-con-c / c-o-cpp.c

puts(sizeof('a') == sizeof(int) ? "C" : "C++");

Ecco il programma:

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("This is %s\n", sizeof 'a' == sizeof(char) ? "C++" : "C");
    return 0;
}

qui è qualche buona lettura sulle differenze C e C ++.

Basta guardare per vedere se sono definite le macro __STDC__ e compilatore __cplusplus.

Una parola, __cplusplus.

sto cercando di indovinare l'intento è quello di scrivere qualcosa che dipende da differenze tra le lingue stesse, non solo macro predefinite. Anche se è tecnicamente non è assolutamente garantito per funzionare, qualcosa di simile è probabilmente più vicino a ciò che è desiderato:

int main() { 
    char *names[] = { "C", "C++"};

    printf("%s\n", names[sizeof(char)==sizeof('C')]);
    return 0;
}

Per quello che vale, ecco un'altra risposta:

char x[sizeof(char *)+2], y[1];
printf("%.*s\n", sizeof(1?x:y)-sizeof(char *)+1, "C++");

Si potrebbe provare direttive del preprocessore, ma che potrebbe non essere ciò che stanno cercando.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top