spamsink: (lenin)
[personal profile] spamsink


Не пользуясь условной компиляцией или знанием, какие значения каких символов препроцессора определяет тот или иной компилятор, напишите программу, валидную и как С, и как С++, которая определяет, в каком стандарте языка она скомпилирована: C89, C99, C11, C++98 или C++11.

Отличить C89 от остальных языков легко, и отличить C от C++ на практике легко, а дальше?



В C11, в отличие от предыдущих версий, есть юникодные строки вида U"...."

#define HAS_UNICODE(U) (sizeof(U"x") > 2)
#include <stdio.h>
int main() { puts(HAS_UNICODE() ? "Yes" : "No"); }


Аналогичный трюк в С++11, где есть "raw strings" вида R"(...)".

Date: 2015-10-26 06:29 pm (UTC)
From: [identity profile] ygam.livejournal.com
Я знаю, что sizeof('A') разное между C и C++, но я не помню, о каких версиях идет речь.

Date: 2015-10-26 06:36 pm (UTC)
From: [identity profile] ygam.livejournal.com
int i = 2
//* */ 2
;

В C89 будет 1; во всех остальных будет 2.
Edited Date: 2015-10-26 06:36 pm (UTC)

Date: 2015-10-26 06:40 pm (UTC)
From: [identity profile] bangor-flying.livejournal.com
У меня включение галочки "C+11 standard" приводит к тому, что обрубается часть казалось бы стандартных возможностей C99, например //-комментариев. Это очень печалит. Навскидку - реализация комплексных чисел разная, принудительное приведение указателей - обязательно в C++ и "очень не рекомендуется" в C, разница в typedef enum ... кстати, zortech/digital mars имеет свои отличия от обычного C++. Если что, я не так давно этим занимаюсь :)

Date: 2015-10-26 07:08 pm (UTC)
From: [identity profile] bangor-flying.livejournal.com
У меня Dev-c++. Он ругается на //-комментарий при установке опций ISO или Gnu C+11, если программа сохранена, как .c, но с .cpp ее пропускает. (Вероятно, я неправильно пользуюсь программой, потому что компилирую то чистые С, то С++ исходники, не меняя настроек). Я подозреваю, что компилятор обрезает при этом подмножество языка до максимально общего в двух стандартах. На такие мысли меня навела книга под названием C/C++ Kompendium, если не ошибаюсь, там в начале рассмотрены разные стандарты языка в качестве пересекающихся множеств и выводятся "безопасные" подмножества. Большое спасибо за интересный комментарий.
Edited Date: 2015-10-26 07:15 pm (UTC)

Date: 2015-10-26 10:32 pm (UTC)
From: [identity profile] qehgt.livejournal.com
Можно использовать всякие %zu в sprintf-подобных функциях. Они, вроде как, в C99 появились. Т.е. можно будет более тонко отличать стандарты.

Date: 2015-10-26 10:41 pm (UTC)
From: [identity profile] archaicos.livejournal.com
Undefined behavior?
Edited Date: 2015-10-26 10:42 pm (UTC)

Date: 2015-10-26 11:19 pm (UTC)
From: [identity profile] qehgt.livejournal.com
Верно, красивого решения оно не даст.

Date: 2015-10-27 02:11 pm (UTC)
From: [identity profile] ygam.livejournal.com
И какое решение?

Date: 2015-10-31 04:56 pm (UTC)
From: [identity profile] ygam.livejournal.com
U-U-U!

Date: 2015-11-02 07:05 pm (UTC)
From: [identity profile] ygam.livejournal.com
sizeof(указатель) всегда больше двух.

Date: 2015-11-02 07:37 pm (UTC)

Profile

spamsink: (Default)
spamsink

February 2026

S M T W T F S
12345 67
8 91011 121314
15161718 192021
22 2324 25262728

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 5th, 2026 09:07 pm
Powered by Dreamwidth Studios