繁体   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