Разминка для мозгов: определение компилятора внутри кода

Доброго времени суток.
Хочу предложить задачу, которая, наверное, будет интересна только новичкам. Формулируется она вот так:

Написать программу, которая, при компиляции как С-программа, во время выполнения выведет на экран «This code was compiled by C compiler». А при компиляции как С++-программа, должна вывести «This code was compiled by C++ compiler»

От себя добавлю, что применять какие-то препроцессорные опции вне кода (например, опцию -D из gcc) запрещено. Ну и имя файла должно быть строго task.c.

Предлагаю сделать полный запрет на использование препроцессорных директов в коде. Иначе это все слишком просто.
А информацию о компиляторе получать в процессе выполнения на основе отладочной информации из бинарника.

Естественно, решение получится не кроссплатформенным, но зато задача становится интереснее.

Предлагаю сделать полный запрет на использование препроцессорных директов в коде. Иначе это все слишком просто.

Зачем? Это ведь не единственный способ.

А информацию о компиляторе получать в процессе выполнения на основе отладочной информации из бинарника.

o_0 Пожалуй это будет слишком сложно.

От себя добавлю, что применять какие-то препроцессорные опции вне кода

__cplusplus

16.8 Predefined macro names

  1. The following macro names shall be defined by the implementation:

__cplusplus

The name __cplusplus is defined to the value 201103L when compiling
a C ++ translation unit.

Такой способ, по идее тоже должен работать. Не проверял, но взял из википедии.
Тем не менее, это на разминку не очень тянет. Алгоритмически интересного решения ни с в случае макросами, ни с типами данных не представляется.

#include <stdio.h>

int main()
{
    printf("%s\n", (sizeof('a') == sizeof(char)) ? "C++" : "C");
    return 0;
}

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.