Scrivere un programma che stamperà “C”, se calcolata come (ANSI) Programma C, e “C ++”, se compilato come un programma C ++
-
19-09-2019 - |
Domanda
http://www.ocf.berkeley.edu/~ WWU / indovinelli / cs.shtml
Sembra molto compilatore specifico per me. Non so dove cercare?
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 ++ typedef
s 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, typedef
s 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.