2013-04-04 129 views
1

我相信這個問題已經被問了很多次了,但我不認爲有一個具體的答案。 如果有,我找不到它,如果可能請指示我。C自定義數據類型

不管怎樣,C是否支持任何方式將字節/單詞/雙字抽象成某種表示?

浮點和雙精度浮點似乎是核心功能,但它們實際上並不是 新的數據類型,而是重新表示現有的dword/qword。

所以,我想知道是否可以這樣做: 讓mydatatype是一個unsignedbyte,它在編譯時自動否定自身。

例如。

mydatatype a = 0xff; 

將以二進制形式表示爲0x00;

我問,因爲C++試圖與超載=和類解決這個問題,但它確實有點 更抽象,比我想的,因爲說,我不允許這樣做:

memcpy(&my_int, &my_float, 4); 

然後,我將被允許按位操作玩弄int和 把它回來

memcpy(&my_float, &my_int, 4); 

然而,我不相信,如果說,浮球被定義爲一類,我能做到這一點低水平 操作,而是完全抽象出除了類方法以外的所有處理方法。

我很好奇,因爲,如果這不是C語言的特徵,爲什麼不呢,這似乎與 完全適合包括花車和雙打的理由,但我們不能創建複雜的數字,即使他們 會就像浮點和雙打一樣簡單地添加到c語言中。

這一直困擾着我很長一段時間,主要是因爲只要我想創建一個數據類型,我開始遷移到void指針,結構和hetrogenous數據類型的領域,這似乎 是聯合國-必要。

例如: 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來表示。

我的意思是,我不認爲我甚至可以聲明很長很長很長(可以嗎?),而不是訴諸創建的typedef ...

爲了使這實際上是一個問題,我將縮小答案到: 此功能是否可用於C?如果是這樣,我該怎麼做? 如果沒有,有這樣一個功能曾經被考慮過,如果不是這只是因爲浮動,雙打是特殊的由於歷史需要的實數表示,使這個抽象特徵成爲核心功能?

我的意思是,我明白像Fortran這樣的語言在默認情況下支持實數,但我認爲C將能夠從「核心功能」中獲取此功能,並允許程序員創建抽象ABI類型,而不需要求助於指向需要釋放的內存塊的指針,並允許在此處進行更強大的類型檢查。

特別是,據我所知,如何抽象完全抽象的靜態數據結構是float和double是非常奇怪的。而所有其他做法都是在動態內存中進行操作,或者允許濫用符號(使用字符,但只能用函數修改)。

結論: C++ 11似乎支持這一點,添加新的數據類型和C會很混亂,花車和雙打都需要因編程實陳述的自然需求,而功能可以通過執行抽象的數據類型,它使它們成爲語言核心的一部分是有意義的。

謝謝! 〜德米特里

+0

縮進一行以4個空格導致其被格式化爲代碼。使用[編輯]鏈接來改進問題的可讀性。 – 2013-04-04 03:54:55

回答

2

C核心語言沒有提供任何方式來重新解釋標準規定以外的任何方式的文字。

C++ 11,在另一方面,引入了用戶定義的文本,由你可以有意義地寫

negbyte operator "" _nb(unsigned long long); 

negbyte val = 0xff_nb; 
+0

這就是我想知道的,nb並不完全是我想要的,但它做到了我所做的。謝謝。 – Dmitry 2013-04-04 03:58:11