2013-04-04 2 views
1

Я считаю, что этот вопрос задавался много раз, но я не думаю, что есть конкретный ответ. Если есть, я не могу его найти, пожалуйста, направить меня, если это возможно.C пользовательские типы данных

В любом случае, поддерживает ли C любой способ абстрагирования байтов/слов/слов в определенное представление?

Плавающие точки с плавающей запятой и двойной точностью, по-видимому, являются основными функциями, но на самом деле они не являются новыми типами данных, но представляют собой повторное представление существующего слова/слова.

так, интересно, возможно ли сделать что-то вроде этого: let mydatatype be unsignedbyte, который автоматически сбрасывает себя при компиляции.

например.

mydatatype a = 0xff; 

будет представлен в двоичной форме как 0x00;

Я спрашиваю, потому что C++ пытается исправить это с перегрузкой =, и классы, но это немного больше абстракции, чем я хотел бы, потому что, скажем, я имею право сделать это:

memcpy(&my_int, &my_float, 4); 

то я бы позволил побитовые манипуляциям играть с междунар и положить его обратно

memcpy(&my_float, &my_int, 4); 

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

Мне любопытно, потому что, если это не функция языка C, то почему нет, это, кажется, идеально сочетается с обоснования включения поплавков и двойников, но мы не можем создавать комплексные числа, несмотря на то, что они бы примерно так же легко добавить к c-языку, как float и double.

Это беспокоило меня в течение некоторого времени, главным образом потому, что, как только я хочу создать тип данных, я начинаю мигрировать в область void-указателей, структур и типов hetrogenous, что кажется , чтобы быть un -необходимо.

например: void * my_data_type = my_data_type_new (0xff); , который «отрицает» 0xff на 0 и сохраняет его в памяти, на которую указывает my_data_type.

это кажется не нужно, потому что все, что я хочу, это negchar my_data_type = 0xff;

который компилятор смог распознать.

, а затем я мог

memcpy(&my_char, &negchar, 1); 

и my_char будет 0.

выше не выполняется в классах C++ ...

поплавки, двойники абстрактны в том смысле, что они ведут себя по-своему, сохраняя ABI, но они не сильно отличаются друг от друга, как говорят, сложные числа, поскольку сложное число также может быть представлено с использованием конкретного ABI.

Я имею в виду, я не думаю, что я могу даже объявить давным-давно (я могу?), Не прибегая к созданию ... определений типов

Чтобы сделать это на самом деле вопрос, я сузит ответы to: Эта функция доступна в C? если да, то как я могу это сделать? Если нет, есть ли такая возможность когда-либо рассматривалась, если это не так, потому что поплавки, двойники являются особыми из-за исторической потребности в реальном представлении чисел, что делает эту абстрактную функцию основной особенностью?

Я понимаю, что языки, такие как Fortran, поддерживали реальные номера по умолчанию, но я думаю, что C сможет извлечь эту функцию из «основной функции» и позволить программисту создавать абстрактные ABI типы, без необходимости прибегать к указателям на блоки памяти, которые необходимо освободить, и обеспечить более сильную проверку типа на нем.

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

Вывод: C++ 11, похоже, поддерживает это, добавление новых типов данных в C будет очень запутанным, поплавки и удвоения необходимы из-за естественного спроса на реальные представления в программировании, и хотя функция может быть реализована посредством абстрактные типы данных, в то время имело смысл сделать их частью ядра языка.

Спасибо! ~ Dmitry

+0

отступов линию с 4-пространства заставляет его быть отформатирована в виде кода. Используйте ссылку [edit], чтобы улучшить читаемость вашего вопроса. –

ответ

2

Ключевой язык C не предоставляет никаких средств для повторной интерпретации литералов любым способом, кроме того, что предусмотрено стандартом.

C++ 11, с другой стороны, вводит определенные пользователем литералов, с помощью которых вы могли бы осмысленно писать

negbyte operator "" _nb(unsigned long long); 

negbyte val = 0xff_nb; 
+0

Это то, что я хотел знать, nb не совсем то, что я хотел, но он делает то, что я сделал. Благодарю. – Dmitry

Смежные вопросы