簡體   English   中英

檢查宏c中的void指針大小

[英]check void pointer size in macro c

我需要檢查void指針是否適合8個字節,所以我檢查它的長度是4還是8.我知道這些值只是,我可以使用_W64 ,只是一個好奇的檢查。

#include <windows.h>
#if (sizeof(void *) == 4)
#define IS64 0
#elif (sizeof(void *) == 8)
#define IS64 1
#else
#error "Pointer size 4 nor 8, make changes in app"
#endif
int APIENTRY WinMain(HINSTANCE hInstance,
        HINSTANCE hPrevInstance, 
        LPTSTR    lpCmdLine, 
        int       cmdShow)
{
    if (IS64) MessageBoxA(NULL, "is 64", "info", MB_OK);
    else MessageBoxA(NULL, "is 32", "info", MB_OK);
    return(0);
}

這段代碼不起作用,我得到一個錯誤app.c(2) : fatal error C1017: invalid integer constant expression

我將宏改為:

#if (sizeof(void *) == sizeof(int32_t))
#define IS64 0
#elif (sizeof(void *) == sizeof(int64_t))
#define IS64 1
#else
#error "Pointer size 4 nor 8, make changes in app"
#endif

同樣的錯誤。 這里有變通方法嗎?

使用sizeof運算符在宏中無效,因為它不是cpp的一部分,它是C語言的一部分。 但您仍然可以在編譯時進行此檢查而無需額外成本,因為良好的編譯器將刪除這樣的死代碼。 事實上,它建議采用一些編碼標准。

編輯:要將此測試留給編譯,您需要這樣的事情:

int IS64;
if (sizeof(void *) == 4)
 IS64  = 0;
else if (sizeof(void *) == 8)
 IS64 = 1;
else
printf ("Pointer size 4 nor 8, make changes in app\n");

接着:

   if (IS64) MessageBoxA(NULL, "is 64", "info", MB_OK);
    else MessageBoxA(NULL, "is 32", "info", MB_OK);

一個好的編譯器會刪除死代碼,即sizeof()返回值(如果在VLA中沒有使用)總是一個常量值,如果它是48而且是編譯器你正在做4 == 48 == 88 == 4它將執行DCE ,你的程序中只有MessageBoxA()而沒有if (IS64)檢查。

GCC附帶了一堆預處理器定義;

為了解決這個特定問題,它提供了__SIZEOF_POINTER__其值為8或4,具體取決於體系結構。

我不是MS編譯器的專家,但我猜它們提供了等效的定義;

對參數的快速搜索(來源: https//docs.microsoft.com/it-it/cpp/preprocessor/predefined-macros?view=vs-2019顯示以下內容:

_M_AMD64定義為針對x64處理器的編譯的整數字面值100。 否則,未定義。

_M_ARM定義為針對ARM處理器的編譯的整數字面值7。 否則,未定義。

_M_ARM_ARMV7VE為針對ARM處理器的編譯設置/ arch:ARMv7VE編譯器選項時定義為1。 否則,未定義。

_M_ARM_FP定義為整數字面值,指示為ARM處理器目標設置了哪個/ arch編譯器選項。 否則,未定義。

_M_ARM64定義為1,用於針對64位ARM處理器的編譯。 否則,未定義。

使用這些信息,您可以為定義賦值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM