LINUX.ORG.RU

Новая версия книги «Modern C», адаптированная для C23

 , ,


3

8

Привет, ЛОР!

Я просто оставлю это здесь: https://inria.hal.science/hal-02383654

В книгу добавлены такие новые (для сишников) штуки как _BitInt(N), constexpr, арифметика с проверкой переполнения, auto, nullptr, typeof и прочие фишки нового стандарта.

Ответ на: комментарий от vbr

Что там в C++ я не знаю и знать не хочу. У этих клоунов даже для malloc каст вручную надо писать. Мертворожденный язык.

Зачем?

#include <stdlib.h>

template <typename T = char>
T* malloc(size_t n) {
    return static_cast<T*>(::malloc(sizeof(T) * n));
}

void test() {
    double *p = malloc<double>(5);
    char *buffer = malloc<>(1024);
}
Даже короче чем в С.

MOPKOBKA ★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 2)
Ответ на: комментарий от a1ba

На самом деле я лучший и самый ответственный среди всех. Я когда в эту компанию пришёл, первым делом закрыл фаерволом постгрес, который торчал голой дупой в интернет с паролем вида lor:lor. Поработав могу ответственно заявить - у других не лучше. Мне кажется, массовых взломов больниц и всего прочего нет только потому, что хакерам банально совестно таким заниматься.

Но в целом посыл поддерживаю, должны. Вот бы их заставить как-нибудь.

vbr ★★★★
()
Последнее исправление: vbr (всего исправлений: 2)
Ответ на: комментарий от zurg

Ага, конечно гарантирует. 10 раз. Все тринадцать страниц списка UB из стандарта. Ололоэ!

Тут каждый второй сишник ЛОРа членом в лоб себя бить готов за право с гордостью писать код, полный UB, при этом заморозив версию компилятора, в ночных кошмарах предсталяя себе количество говна, которое всплывёт при попытке обновиться. Один аж до сих пор код компилит в MSVC97.

hateyoufeel ★★★★★
() автор топика

и прочие фишки нового стандарта
B.2. Missing #embed. Unfortunately, as of March 2024, the #embed feature does not seem to have arrived in the compilers that we have at our disposal.

// clang-19/clang-20 -std=c23 embed.c

#include <stdio.h>

const char source[] = {
#if defined(__has_embed) && __has_embed("embed.c")
# embed "embed.c"
, '\0'
#else
"#embed directive is missing\0"
#endif
};

int main()
{
    printf("%s\n", source);
}

Работает с clang-19/20, а с gcc 14.2.0 – нет.

dataman ★★★★★
()
Ответ на: комментарий от a1ba

если 10 человек будет - закажу на паритетных началах - каждый платит за свой экзземпляр + пересылка, в Москве на Юго-Западе или в (иногда по договоренности) центре могу передать в руки.

Как люди наберутся = сделаю чатик в телеге и организуемся.

aiqu6Ait ★★★★
()
Ответ на: комментарий от uin

а в чём проблема? UB – свойство языка, введённое в него целенаправленно. Виртуальная машина – особенность реализации. Они никак не связаны.

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от hateyoufeel

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

uin ★★★
()
Ответ на: комментарий от uin

А в том что когда вместо виртуальной машины физическое железо поведение зависит от реализации того или иного вендора

чо?

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

Чо #2?

Причём тут UB в C, мальчик?

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 1)
Ответ на: комментарий от hateyoufeel

Ну а как ты понимаешь «неопределенное поведение»?
Я вот понимаю как освещение дороги в темное время суток, в рамках разметки гарантия что все безопасно, а если выезжаешь за полоску обочины то там может быть все что угодно и яма и забор и болото, смотря где едешь

uin ★★★
()
Ответ на: комментарий от uin

Ну а как ты понимаешь «неопределенное поведение»?

Как это написано в стандарте C. Т.е. существует некий набор паттернов в коде на C, которых там быть не должно (программа с ними считается невалидной). В случае же возникновения такого паттерна, поведение компилятора не определено и он может выдать любое говно вместо кода.

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от hateyoufeel

Т.е. существует некий набор паттернов в коде на C, которых там быть не должно (программа с ними считается невалидной).

В программе нет никакого кода на си. Там сугубо машинный язык и вызовы из сишной библиотеки, которой пользуется и твой раст.
И поскольку машина может не иметь MMU не иметь устройства деления и поэтому прерывания при делении на ноль не будет не говоря уже про приколы в компиляторах, то тебя предупреждают что то что на интеле с gcc вот так не гарантируется что на другом железе с другим компилятором будет так же. Приказывать в стандарте при появлении желтых штанов делать два раза ку это:
a) писать виртуальный процессор который все это симулирует (VM)
б) работать только на правильных ос на правильных процессорах и правильном компиляторе

последнее как правило считается моветоном.

uin ★★★
()
Ответ на: комментарий от uin

Т.е. существует некий набор паттернов в коде на C, которых там быть не должно (программа с ними считается невалидной).

В программе нет никакого кода на си.

В программе на Си есть код на Си, чувак. Иначе бы это не программа на Си. Когда в треде про Си я пишу про неопределённое поведение, я использую этот термин в том смысле, в котором он описан в стандарте языка Си. Твоя шизофрения здесь никак не релевантна в принципе.

Хуже того, неопределённое поведение в Си имеет именно отношение к исходному коду. Например, незакрытая кавычка входит в список случаев неопределённого поведения.

hateyoufeel ★★★★★
() автор топика
Ответ на: комментарий от vbr

От этого бреда в C++ тоже никакой пользы. В теории когда будет перегрузка f(int) и f(void*), 0 ближе к int, чем к указателю, что создает «проблему». Но вы хоть раз такую «проблему» встречали?

zx_gamer ★★★
()
Последнее исправление: zx_gamer (всего исправлений: 1)
Ответ на: комментарий от zx_gamer

Ага, щас, пойду позвоню одному из предыдущих работодателей и потребую лог коммитов за ~2018 год, чтобы показать тебе.

Алсо, начиная с C++11 и C23 вот такое вполне валидно в C/C++:

#define NULL nullptr

лмао. Так что твой аргумент вообще мимо.

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 2)
Ответ на: комментарий от vbr

Я хочу сказать что

#include <iostream>

void f(int) {
  std::cout << "f(int)" << std::endl;
}

void f(void*) {
  std::cout << "f(void*)" << std::endl;
}

int main(void) {
  f(NULL);
  f(0);
}
nulloverload.cc: In function ‘int main()’:
nulloverload.cc:12:4: error: call of overloaded ‘f(NULL)’ is ambiguous
   12 |   f(NULL);
      |   ~^~~~~~
nulloverload.cc:3:6: note: candidate: ‘void f(int)’
    3 | void f(int) {
      |      ^
nulloverload.cc:7:6: note: candidate: ‘void f(void*)’
    7 | void f(void*) {
hateyoufeel ★★★★★
() автор топика