Re[15]: Достаточно ли знать С без знания С++ для устройства
От: Cyberax Марс  
Дата: 05.09.14 07:53
Оценка: +1
Здравствуйте, eskimo82, Вы писали:

C>>А она есть. Сначала появился драфт в комитете С++, потом его принял комитет С.

E>А перед этим появились различные интересные функции в компиляторах для Си.
А перед этим появилась первая бактерия.

E>>>1. В языке Си есть 3 непересекающихся (в отличии от C++) пространства имен — для struct, union, enum и глобальное для typedef. Твой код просто не соберется, ибо test_t не определен в глобальном пространстве имен. Он собрался бы, если бы ты написал struct test_t testit().

C>>И що?
E>Не позорься, вот и то.
Я это знаю прекрасно, мне просто непонятно причём тут это.

E>>>2. Возвращать структурные типы стало можно в C99.

C>>Бредишь. Это возможно чуть ли не с K&R C, точно было в C89. Классика жанра — возвращение структуры POINT в WinAPI.
E>1. Что я неприпоминаю, что там за функция в Win32 API возвращает POINT. Можеш напомнить ?
В общем, я считаю, что ламеризм (воинствующее незнание) надо наказывать долларом. Так что предлагаю поспорить на $100, что в С89 есть возврат структур, аналогичный побайтному копированию.

C>>Нету в С преимуществ.

E>Исходя из разговора с тобой, мне видно, что языка Си ты вообще-то незнаеш. Грубая путаница с C++.
LOL.

C>>Это не эквивалентный код. В Java используется reference-тип.

E>И там и там приведен код который обьекта — агрегата.
ЩИТО? В Java все объекты — это reference-типы. Если бы в Java были value-типы, то тоже всё было бы как в С++.

C>>Оно скомпилируется и будет падать.

E>Как мы видим, здесь указатель, а не int. Какой неприкрытый фейл...
Можно и int, не вопрос:
int mode;
chmod("/some/file", mode); //Are you feeling lucky today?


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

C>>В С это делается на порядки проще.
E>Куда уж проще чем в Java-то ? Тебя носом даже в пример потыкали.
У тебя нос уже давно в навозе. В Java пишется так:
public class Test
{
   private final IdentityHashMap map;
   void do_something()
   {
      map.get("aa");
   }
};

Оно выдаст ошибку компиляции.

В чистом С пишется так:
struct list_t
{
    struct list_t *next;
    int payload;
};

struct something_t
{
    struct list_t head;
};

А потом ищутся баги с неинициализированным next.

C>>Создай пару контейнеров, разворачивающихся в static-функции.

E>В Си это делается на порядок проще. Но пример ты так и не привел, ожидаем-с.
Да ну?
#define LIST_CLAZZ(T,NM) \
    struct NM { struct NM* next; T payload; }; \
    static void add_to_#NM(NM* tail, T payload) {...};

"Методы" add_to... будут в каждом используемом файле инстанцироваться отдельно, за счёт static'а. Если static убрать, то получим конфликты времени связывания и/или неоптимальный код из-за отсутствия inlining'а.
Sapienti sat!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.