Escribir un programa que va a imprimir “C” si se compila como un programa en C (ANSI), y “C ++” si se compila como un programa en C ++

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

  •  19-09-2019
  •  | 
  •  

Pregunta

http://www.ocf.berkeley.edu/~ wwu / acertijos / cs.shtml

Se ve muy compilador específico para mí. No sabe dónde buscar?

¿Fue útil?

Solución

Bastante simple.

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

O existe un requisito de hacer esto sin la norma oficial?

Otros consejos

Hemos tenido que hacer un trabajo similar en la escuela. No nos permitieron usar preprocesador (a excepción de #include por supuesto). El código siguiente, se utiliza el hecho de que en C, nombres de tipo y nombres de estructura forman espacios de nombres separados mientras que en C ++ no lo hacen.

#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");
}

No conozco 7 enfoques:

1. Abuso C ++ typedefs automáticas

(Tenga en cuenta que la estructura tiene que ser declarado en un ámbito interno de modo que tiene prioridad sobre el nombre exterior en C ++.)

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

Una versión similar que no se basa en la ambigüedad entre sizeof (type) y sizeof (variable), utilizando sólo los tipos:

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

2. Abuso de C ++ de equivalencia struct / class, typedefs automáticos, y constructores por defecto generadas automáticamente

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

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

3. Abuso anidado declaraciones struct en C

También ver Símbolo choque de estructuras interior y exterior , 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. Abuso comentarios //

Esto no funcionará con C99 o C89 con los compiladores que apoyan // como una extensión.

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

o, alternativamente:

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

5. sizeof diferencias con literales char

Tenga en cuenta que esto no está garantizado para ser portátil, ya que es posible que algunos plataforma hipotética podría utilizar bytes con más de 8 bits, en cuyo caso sizeof(char) podría ser el mismo que sizeof(int). (Véase también Puede sizeof (int) nunca sea 1 en un alojada implementación? )

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

6. Abuso diferencias en cuando se realizan conversiones lvalue⇒rvalue

Esto se basa en la 5.16, 5.17, 5.18 ejemplo en la norma 03 del ISO C ++, y funciona en gcc, pero no en MSVC (posiblemente debido a un error del compilador?).

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

7. diferencias abuso En la forma gramáticas C y C ++ 's analizar el operador ternario

Éste no es estrictamente legal, pero algunos compiladores son laxos.

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

(También puede comprobar para la macro __cplusplus preprocesador (o varias otras macros), pero creo que no sigue el espíritu de la pregunta.)

Tengo implementaciones para todos ellos en: http://www.taenarum.com/csua/ diversión con-c / c-o-cpp.c

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

Aquí está el programa:

#include <stdio.h>

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

aquí es una lectura agradable en las diferencias de C y C ++.

Basta con mirar para ver si se definen las macros __STDC__ y compilador __cplusplus.

Una palabra, __cplusplus.

Estoy adivinando la intención es escribir algo que depende de las diferencias entre los mismos, no sólo macros predefinidas idiomas. A pesar de que técnicamente no está garantizado en absoluto al trabajo, algo como esto es probablemente más cerca de lo que se desea:

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

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

Por lo que vale, aquí hay otra respuesta:

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

Usted podría intentar directivas del preprocesador, pero que podría no ser lo que ellos están buscando.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top