2014-02-20 8 views
0

Нужно написать программу на C. Если он запущен в компиляторе языка C, программа должна напечатать «C». Если он запущен в компиляторе C++, он должен печатать «C++».Как написать программу, которая определяет ее компилятор

Директивы препроцессора не могут использоваться.

В голову приходит только сравнить размер любого характера с char размера, как:

sizeof(char)==sizeof('a') 

Вот как это работает:

// C code: 
#include <stdio.h> 
int main() 
{ 
    printf("%s", (sizeof(char)==sizeof('a') ? "C++" : "C")); 
    return 0; 
} 

Выход: C

// C++ code: 
#include <stdio.h> 
int main() 
{ 
    printf("%s", (sizeof(char)==sizeof('a') ? "C++" : "C")); 
    return 0; 
} 

Выход: C++

Там лучший способ?

+1

Выберите любой из ответов на связанный вопрос. –

+0

Вместо этого вы можете использовать 'sizeof ('a') == 1', так как' sizeof (char) == 1' по определению. –

+0

Это разумный способ выполнить эту работу (по крайней мере, если вы также напечатаете новую строку). Это целая куча проще, чем то, что я ожидал от названия, а именно определение имени компилятора и номера версии. –

ответ

2

Вы можете проверить макрос __cplusplus, чтобы узнать, скомпилированы ли вы как C++.

#include <stdio.h> 

int main() 
{ 
    printf("%s\n", 
#if __cplusplus 
      "C++" 
#else 
      "C" 
#endif 
     ); 
} 
+1

'Препроцессорные директивы не могут использоваться.'. Но вы можете также сделать юмористический трюк '#if true'. –

2

Стандартная http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf Содержит приложение о различиях между C и C++

Так он содержит полукокс против разницы Int, который вы используете, но также, например,

Изменение: В C++ , объявление класса вводит имя класса в область , где оно объявляется и скрывает любой объект, функцию или другое объявление этого имени в охватывающей области. В C, внутренняя декларация видимости имени структуры тега никогда не скрывает имени объекта или функции во внешней области видимости

Примера: (от стандарта)

int x [99]; 
void f() { 
    struct x { int a ; }; 
    sizeof (x); /∗ size of the array in C ∗/ 
        /∗ size of the struct in C++ ∗/ 
} 

К которому GCC дал 396 и g ++ 4 на моей машине

Смежные вопросы