将指针转换为数字

时间:2016-05-09 13:00:39

标签: c++ gcc casting

我正在尝试在gcc中交叉编译一些代码并遇到以下问题。库想要将指针视为数字,而gcc正在抱怨[-fpermissive]标志。让我展示一些简化的代码来解释。

void fun(U32 var)
{...}

typedef struct
{
    U16 var0;
    U16 reserved0;
    U16 var1;
    U16 reserved1;
} Str_t;

Str_t structBase;
Str_t* structVar = &structBase;

fun(U32(&structVar->var1)); 

gcc输出: 错误:从U16 *转换为U32失去精度[-fpermissive]

我定义一个指向的奇怪的代码似乎没有理由是在头文件中模拟一行,如:

#define structVar        (Str_t* PERIPH_BASE_ADDR)

#define来自库的不同部分,并且正在转换静态内存位置。目标是微控制器,这种类型的目标是常见的。我知道这是一个非标准的事情,但要求我这样做的图书馆是我的项目所必需的。在这种情况下,我最好的选择是什么?

---编辑
我遇到的基本问题是我的原始目标是32位微控制器,而我的第二个目标是64位PC。这里的挑战之一是微控制器通常受资源限制。在这里使用std libs并不总是一个好主意。

1 个答案:

答案 0 :(得分:0)

您是否希望传递成员的偏移量?

如果是这样,便携式(且正确)的方式是使用offsetof

e.g:

#include <cstdint>
#include <cstddef>

void fun(std::uint32_t var)  // int would be perfectly acceptable here
{}

typedef struct
{
    std::uint16_t var0;
    std::uint16_t reserved0;
    std::uint16_t var1;
    std::uint16_t reserved1;
} Str_t;

Str_t structBase;
Str_t* structVar = &structBase;

int main()
{
    fun(offsetof(Str_t, var1)); 
}

否则,如果您要传递地址,请传递地址:

#include <cstdint>
#include <cstddef>
#include <utility>

void fun(std::uint16_t* var)
{}

typedef struct
{
    std::uint16_t var0;
    std::uint16_t reserved0;
    std::uint16_t var1;
    std::uint16_t reserved1;
} Str_t;

Str_t structBase;
Str_t* structVar = &structBase;

int main()
{
    fun(std::addressof(structVar->var0)); 
}