我正在尝试在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并不总是一个好主意。
答案 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));
}