[英]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中沒有使用)總是一個常量值,如果它是4
或8
而且是編譯器你正在做4 == 4
或8 == 8
或8 == 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.