亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將指針轉換為整數

將指針轉換為整數

C++
萬千封印 2019-11-28 13:57:01
我正在嘗試將現有代碼修改為64位計算機。主要問題是在一個函數中,以前的編碼器使用void *參數,該參數在函數本身中轉換為合適的類型。一個簡短的例子:void function(MESSAGE_ID id, void* param){    if(id == FOO) {        int real_param = (int)param;        // ...    }}當然,在64位計算機上,我得到以下錯誤:error: cast from 'void*' to 'int' loses precision我想更正此問題,以便它仍可在32位計算機上且盡可能干凈地工作。任何的想法 ?
查看完整描述

3 回答

?
慕容森

TA貢獻1853條經驗 獲得超18個贊

我會說這是現代的C ++方式。


#include <cstdint>

void *p;

auto i = reinterpret_cast<std::uintptr_t>(p);

編輯:


正確的整數類型

因此將指針存儲為整數的正確方法是使用uintptr_tor intptr_t類型。(另請參見c99的 cppreference 整數類型)。


這些類型在<stdint.h>C99 中定義,在stdC ++ 11中的命名空間中定義<cstdint>(請參閱C ++的整數類型)。


C ++ 11(及更高版本)版本


#include <cstdint>

std::uintptr_t i;

C ++ 03版本


extern "C" {

#include <stdint.h>

}


uintptr_t i;

C99版本


#include <stdint.h>

uintptr_t i;

正確的鑄造工人

在C語言中,只有一個強制轉換,而在C ++中使用C強制轉換卻不受歡迎(因此請不要在C ++中使用它)。在C ++中,有不同的強制轉換。reinterpret_cast是此轉換的正確轉換(另請參見此處)。


C ++ 11版本


auto i = reinterpret_cast<std::uintptr_t>(p);

C ++ 03版本


uintptr_t i = reinterpret_cast<uintptr_t>(p);

C版


uintptr_t i = (uintptr_t)p; // C Version


查看完整回答
反對 回復 2019-11-28
?
繁華開滿天機

TA貢獻1816條經驗 獲得超4個贊

有幾個答案指出uintptr_t并#include <stdint.h>稱為“解決方案”。我建議,這是答案的一部分,而不是全部答案。您還需要查看消息ID為FOO的函數的調用位置。


考慮以下代碼和編譯:


$ cat kk.c

#include <stdio.h>

static void function(int n, void *p)

{

    unsigned long z = *(unsigned long *)p;

    printf("%d - %lu\n", n, z);

}


int main(void)

{

    function(1, 2);

    return(0);

}

$ rmk kk

        gcc -m64 -g -O -std=c99 -pedantic -Wall -Wshadow -Wpointer-arith \

            -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes \

            -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE kk.c -o kk 

kk.c: In function 'main':

kk.c:10: warning: passing argument 2 of 'func' makes pointer from integer without a cast

$

您會發現在調用位置(中的main())存在問題-將整數轉換為沒有強制轉換的指針。您將需要分析function()其所有用法,以了解如何將值傳遞給它。function()如果調用被編寫,我內部的代碼將起作用:


unsigned long i = 0x2341;

function(1, &i);

由于您的編寫方式可能有所不同,因此您需要檢查調用該函數的要點,以確保使用所示值有意義。別忘了,您可能會發現一個潛在的錯誤。


另外,如果您要格式化void *參數的值(轉換后的格式),請仔細查看<inttypes.h>標題(而不是stdint.h— inttypes.h提供的服務stdint.h,這是不尋常的,但是C99標準指出,標題<inttypes.h>包含標題<stdint.h>和通過托管實現提供的其他功能對其進行擴展),并在格式字符串中使用PRIxxx宏。


另外,我的評論嚴格適用于C而不是C ++,但是您的代碼位于C ++的子集中,該子集可在C和C ++之間移植。我的評論適用的機會是公平的。


查看完整回答
反對 回復 2019-11-28
  • 3 回答
  • 0 關注
  • 1602 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號