2012-11-30 17 views
0

我有一個方法指針尺寸,32位Vs的方法內的64位指針大小,並且該方法

**int** create_object(Object* parent, char* name, int type, int start_block) { 
    ... 
    return ptr_to_object; 
} 

功能ptr_to_object內的返回值似乎是32位,但隨後一旦它離開它,它看起來像它的64位。

注:我不能使用c99,我知道intptr_t是c99的一部分。

您有什麼建議?謝謝!

+7

「ptr_to_object」的類型是什麼,是否有任何理由不能返回實際的指針而不是整數? (eg.g返回一個Object *) – nos

+0

不完全標準,但通常'長'似乎足夠用於指針。再次,不是標準。 – Shahbaz

+0

'** int **'這應該是什麼類型? – Lundin

回答

1

如果您正在處理指針,請使用指針返回類型,或者將其隱藏爲標準定義的int類型,以便足夠支持指針。這種類型的可以存在,但不保證存在(TMK):

C99 7.20.1.4整數類型能夠保持對象指針

  1. 以下類型表示一個有符號整數類型的屬性,任何有效的指針void可以轉換爲這種類型,然後轉換回void指針,結果將比較等於原始指針:

    使用intptr_t

    以下類型表示具有任何有效的指針的孔隙可以被轉換爲這種類型的屬性的無符號整數類型,則轉換回指向void,結果將比較等於原指針:

    uintptr_t的

    這些類型是可選的

關鍵字有可選。機會很可能是在您選擇的平臺上定義的,但對於傳統的可移植性,您可能更適合返回void *或向類型化的或無效的指針聲明專門的「句柄」並將其返回。

與往常一樣,我完全感興趣的是任何與C99兼容平臺合作的人選擇而不是來公開某些在標準中可選的功能(如此類)。如果有人在<stdint.h>沒有intptr_t和/或uintptr_t我很好奇。如果你使用這樣的工具鏈,請留下評論。

0

就像@nos說的,如果你在處理指針,那麼就使用指針類型。將它們轉換爲整數是不可移植的並且容易出錯。

如果你不希望來電者知道這是一個指針(不反正挖了一點),然後用typedef創建「處理」型,或者說:

typedef my_ptr* object_handle; 

事實上,做到這一點即使你的「手柄」真的是的整數。抽象將允許您更改它,以後不需要修改任何調用代碼。