C++ на C
От: qqqqq  
Дата: 18.03.23 16:04
Оценка:
Что делать если компилятор только C (встроенная система) a хочется писать на C++? Не совсем на C++, конечно, но хотя бы на C с классами (C). Типа driver1.Init(), driver1.Send()... driver-у естествено нужны свои данные типа начала адресов регистров, или там внутренний временный буффер. Соответственно driver2 — другие данные. Вот тут к примеру предложение а есть еще методы?
https://chunminchang.github.io/blog/post/how-to-simulate-a-c-class-in-c
Re: C++ на C
От: pagid_ Россия  
Дата: 18.03.23 16:39
Оценка: +1
Здравствуйте, qqqqq, Вы писали:

Q>Что делать если компилятор только C (встроенная система) a хочется писать на C++? Не совсем на C++, конечно, но хотя бы на C с классами (C). Типа driver1.Init(), driver1.Send()... driver-у естествено нужны свои данные типа начала адресов регистров, или там внутренний временный буффер. Соответственно driver2 — другие данные. Вот тут к примеру предложение а есть еще методы?

Самое первое предложение было от Страуструпа.
Сдается мне, проще всего и наиболее конструктивно забить на "хочется"
Re: C++ на C
От: opfor  
Дата: 18.03.23 17:02
Оценка: +1
Здравствуйте, qqqqq, Вы писали:

Q>Что делать если компилятор только C (встроенная система)?


а что за контроллер?
Re: C++ на C
От: Zhendos  
Дата: 18.03.23 23:35
Оценка: 16 (2) +1
Здравствуйте, qqqqq, Вы писали:

Q>Что делать если компилятор только C (встроенная система) a хочется писать на C++? Не совсем на C++, конечно, но хотя бы на C с классами (C). Типа driver1.Init(), driver1.Send()... driver-у естествено нужны свои данные типа начала адресов регистров, или там внутренний временный буффер. Соответственно driver2 — другие данные. Вот тут к примеру предложение а есть еще методы?

Q>https://chunminchang.github.io/blog/post/how-to-simulate-a-c-class-in-c

Есть такой проект: https://github.com/JuliaHubOSS/llvm-cbe ,
как раз для таких случаев. Компилируешь C++ с помощью clang и на выходе получаешь C код.
Re: C++ на C
От: SkyDance Земля  
Дата: 19.03.23 05:08
Оценка: +1 :)
Q>Что делать если компилятор только C (встроенная система) a хочется писать на C++?

Найти другую работу. А эту отдать тому, кому нравится С. Их таких много. Потому что голый С — это прикольно
Re: C++ на C
От: cppguard  
Дата: 19.03.23 08:25
Оценка:
Здравствуйте, qqqqq, Вы писали:

Q>Что делать если компилятор только C (встроенная система) a хочется писать на C++? Не совсем на C++, конечно, но хотя бы на C с классами (C). Типа driver1.Init(), driver1.Send()... driver-у естествено нужны свои данные типа начала адресов регистров, или там внутренний временный буффер. Соответственно driver2 — другие данные. Вот тут к примеру предложение а есть еще методы?

Q>https://chunminchang.github.io/blog/post/how-to-simulate-a-c-class-in-c

Написать свой транслятор. Это вообще не сложно. Грамматика Си примитивная, есть готовая в различных открытых генераторах грамматик. Модифицировать для своих нужд тоже легко. Далее парсим, строим AST и одним проходом сразу транслируем в Си.

У меня когда-то была идея нечто подобное, чтобы добавить в Си немного безопасности. Например, пару аргументов size_t, void* можно оборачивать в один аргумент типа, который бы инкапсулировал непрерывный отрезок памяти известной длины. А добавив функции prefix(), suffix() и так далее можно было бы избавиться от ошибки "off by 1". Я позже был рад увидеть реализацию этой идеи в С++ в виде span.
Re: C++ на C
От: _NN_ www.nemerleweb.com
Дата: 19.03.23 10:56
Оценка:
Здравствуйте, qqqqq, Вы писали:

Q>Что делать если компилятор только C (встроенная система) a хочется писать на C++? Не совсем на C++, конечно, но хотя бы на C с классами (C). Типа driver1.Init(), driver1.Send()... driver-у естествено нужны свои данные типа начала адресов регистров, или там внутренний временный буффер. Соответственно driver2 — другие данные. Вот тут к примеру предложение а есть еще методы?

Q>https://chunminchang.github.io/blog/post/how-to-simulate-a-c-class-in-c

Кросскомпиляция возможна ?
Может получится собрать компилятор C++ , и далее потом писать на плюсах.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: C++ на C
От: kov_serg Россия  
Дата: 19.03.23 11:01
Оценка: :)))
Здравствуйте, _NN_, Вы писали:

Q>>Что делать если компилятор только C (встроенная система) a хочется писать на C++? Не совсем на C++, конечно, но хотя бы на C с классами (C). Типа driver1.Init(), driver1.Send()... driver-у естествено нужны свои данные типа начала адресов регистров, или там внутренний временный буффер. Соответственно driver2 — другие данные. Вот тут к примеру предложение а есть еще методы?

Q>>https://chunminchang.github.io/blog/post/how-to-simulate-a-c-class-in-c

_NN>Кросскомпиляция возможна ?

_NN>Может получится собрать компилятор C++ , и далее потом писать на плюсах.

Вы объём еб&и представляете?
Re: C++ на C
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 19.03.23 12:26
Оценка:
Здравствуйте, qqqqq, Вы писали:

Q>Что делать если компилятор только C (встроенная система) a хочется писать на C++?

Поискать бэкенд к llvm под свой таргет. Мб получится.
Q>Вот тут к примеру предложение а есть еще методы?
gobject, но это боль.
Sic luceat lux!
Re: C++ на C
От: ononim  
Дата: 19.03.23 14:02
Оценка: 5 (1) +2
Q>Что делать если компилятор только C (встроенная система) a хочется писать на C++? Не совсем на C++, конечно, но хотя бы на C с классами (C).

driver.h:
struct Driver;

struct Driver *Driver_Init(void);
void Driver_Send(struct Driver *d, const void *data, size_t len);


driver.c:
struct Driver
{
    int fd;
};

struct Driver *Driver_Init(void)
{
    Driver *d = malloc(sizeof(struct Driver));
    d->fd = open(....);
    return d;
}
void Driver_Send(struct Driver *d, const void *data, size_t len)
{
    write(d->fd, data, len);
}


user.c:
#include "driver.h"
struct Driver *d = Driver_Init();
Driver_Send(d, "hello", 5);
Как много веселых ребят, и все делают велосипед...
Отредактировано 19.03.2023 14:03 ononim . Предыдущая версия .
Re[2]: C++ на C
От: _NN_ www.nemerleweb.com
Дата: 24.03.23 20:37
Оценка: +1
Здравствуйте, ononim, Вы писали:


Зачем кучу использовать. У нас встроенная система где лучше это минимизировать.
Также можно скрыть приватные члены структуры и получаем инкапсуляюци.

// Driver.h
#include <stddef.h>

struct Driver
{
    char _internal_impl[4];
};

void Driver_Init(struct Driver* d);
void Driver_Send(struct Driver *d, const void *data, size_t len);

// Driver.c
#include <assert.h>

struct DriverImpl
{
    int fd;
};

// C11: https://en.cppreference.com/w/c/language/static_assert
static_assert(sizeof(struct Driver) == sizeof(struct DriverImpl), "Driver and DriverImpl size must be the same");

void Driver_Init(struct Driver* d)
{
    struct DriverImpl* di = (struct DriverImpl*)d;
    di->fd = open();
}

void Driver_Send(struct Driver *d, const void *data, size_t len)
{
    struct DriverImpl* di = (struct DriverImpl*)d;
    write(di->fd, data, len);
}


P.S.
К сожалению, сходу не удалось найти простого способа вывести размер DriverImpl если его размер не совпадает с Driver.

А так размер Driver легко получить, например, таким кодом:
switch(1) {
 case sizeof(struct DriverImpl):
 case sizeof(struct DriverImpl):
};

Компилятор выведет в ошибке размер структуры.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: C++ на C
От: sergii.p  
Дата: 29.03.23 09:19
Оценка:
Здравствуйте, _NN_, Вы писали:

а зачем?
_NN>
struct Driver
{
    char _internal_impl[4];
};


можно же просто
struct Driver;


forward declaration в C вроде разрешены. Или это от версии зависит?
Re[4]: C++ на C
От: _NN_ www.nemerleweb.com
Дата: 29.03.23 09:28
Оценка: 2 (1)
Здравствуйте, sergii.p, Вы писали:

SP>forward declaration в C вроде разрешены. Или это от версии зависит?


Так нельзя, иначе мы не сможем создать объект на стеке.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: C++ на C
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 29.03.23 14:13
Оценка: +1
Здравствуйте, qqqqq, Вы писали:

Q>https://chunminchang.github.io/blog/post/how-to-simulate-a-c-class-in-c


В этом способе огромнейший оверхед по памяти — по сути, таблица виртуальных функций помещается в каждый объект
Маньяк Робокряк колесит по городу
Re[3]: C++ на C
От: Слава  
Дата: 29.03.23 14:47
Оценка:
Здравствуйте, kov_serg, Вы писали:

_NN>>Кросскомпиляция возможна ?

_NN>>Может получится собрать компилятор C++ , и далее потом писать на плюсах.

_>Вы объём еб&и представляете?


Да, лучше компилятор Rust собрать.
Re: C++ на C
От: BSOD  
Дата: 29.03.23 20:42
Оценка:
Здравствуйте, qqqqq, Вы писали:

Q>Вот тут к примеру предложение а есть еще методы?

Q>https://chunminchang.github.io/blog/post/how-to-simulate-a-c-class-in-c

И чо? GTK на подобных трюках строится. Или обертки/шаблоны реализации по COM.
Да и WINAPI изначально задумывалась как объектно-ориентированная, хотя на Си.
Sine vilitate, sine malitiosa mente
Re[2]: C++ на C
От: B0FEE664  
Дата: 31.03.23 12:05
Оценка:
Здравствуйте, pagid_, Вы писали:

Q>>Что делать если компилятор только C (встроенная система) a хочется писать на C++? Не совсем на C++, конечно, но хотя бы на C с классами (C). Типа driver1.Init(), driver1.Send()... driver-у естествено нужны свои данные типа начала адресов регистров, или там внутренний временный буффер. Соответственно driver2 — другие данные. Вот тут к примеру предложение а есть еще методы?

_>Самое первое предложение было от Страуструпа.
_>Сдается мне, проще всего и наиболее конструктивно забить на "хочется"

Меня всегда интересовала, а сам никогда не пробовал: почему в таком случае нельзя писать на С++ и делать статическую линковку? По идее должно получится просто standalone приложение. Или есть какие-то проблемы?
И каждый день — без права на ошибку...
Re[3]: C++ на C
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 31.03.23 13:24
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Меня всегда интересовала, а сам никогда не пробовал: почему в таком случае нельзя писать на С++ и делать статическую линковку? По идее должно получится просто standalone приложение. Или есть какие-то проблемы?


манглинг имен. Нужно тогда extern "C" переходники ещё делать. Ну и для сишечки указатели на объекты кастовать в void* и обратно. Геморно. Ну и ТС сказал, что на платформе нет компилятора плюсов
Маньяк Робокряк колесит по городу
Re[2]: C++ на C
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 31.03.23 13:26
Оценка:
Здравствуйте, BSOD, Вы писали:

Q>>Вот тут к примеру предложение а есть еще методы?

Q>>https://chunminchang.github.io/blog/post/how-to-simulate-a-c-class-in-c

BSO>И чо? GTK на подобных трюках строится.


А ты видел эти ихние ГОбжекты? Вот, то-то


BSO>Или обертки/шаблоны реализации по COM.


На сишечке всё равно никто в здравом уме их не юзает


BSO>Да и WINAPI изначально задумывалась как объектно-ориентированная, хотя на Си.


Он и сейчас такой, если что. Только геморно это, ООП на сишечке эмулировать
Маньяк Робокряк колесит по городу
Re[4]: C++ на C
От: B0FEE664  
Дата: 31.03.23 15:03
Оценка: +1
Здравствуйте, Marty, Вы писали:

BFE>>Меня всегда интересовала, а сам никогда не пробовал: почему в таком случае нельзя писать на С++ и делать статическую линковку? По идее должно получится просто standalone приложение. Или есть какие-то проблемы?

M>манглинг имен. Нужно тогда extern "C" переходники ещё делать. Ну и для сишечки указатели на объекты кастовать в void* и обратно. Геморно.
Ерунда. Всегда так делаю.

M>Ну и ТС сказал, что на платформе нет компилятора плюсов

Компилятор и собрать можно...
Кросс компиляцию, опять же, никто не отменял, а для статики должно ещё проще быть.
И каждый день — без права на ошибку...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.