不太明白的是:uintptr_t value(astruct.val)

时间:2012-02-27 10:19:16

标签: c++ templates

我在c ++源文件(不是标题)中找到了以下语法:

template <typename Type_> static void aFunction(Type_ &function, ...) {
    uintptr_t value(astruct.val); //confusing
}

这个令人困惑的问题是否有价值宣言?我尝试写一个你好的世界计划,如:

int main(){ uintptr_t a(80); return 0;}

并且它在数字常量之前返回一个预期的声明说明符或'...',我可以知道这个令人困惑的行做了什么吗?谢谢!

编辑:我想我应该透露完整的功能声明:

    template <typename Type_>
static void nlset(Type_ &function, struct nlist *nl, size_t index) {
    struct nlist &name(nl[index]);
    uintptr_t value(name.n_value);// this is the confusing line
    if ((name.n_desc & N_ARM_THUMB_DEF) != 0)
        value |= 0x00000001;
    function = reinterpret_cast<Type_>(value);
}

2 个答案:

答案 0 :(得分:2)

如您所知,std::uintptr_t是标题<cstdint>中的标准类型(自C ++ 11起)。

您不理解的行是一个简单的变量声明+定义:

uintptr_t value(name.n_value);

这声明了一个名为value的{​​{1}}类型的变量,并使用uintptr_t的值对其进行初始化。对于基本类型,这相当于:

name.n_value

  

我尝试编写一个hello world程序,如:

uintptr_t value = name.n_value;
     

并返回错误[...]

什么错误?始终发布您收到的错误消息,没有人可以帮助您“我收到错误”!

我怀疑你得到的错误是由于int main(){ uintptr_t a(80); return 0;} 没有定义,除非你包含uintptr_t,然后你应该使用<cstdint>命名空间前缀。

答案 1 :(得分:1)

uintptr_t是无符号整数(至少)指针的大小。

虽然它不是原生类型,但您需要包含<stdint.h><cstdint>

将int指针转换为整数变量并将它们存储为整数变量实际上是“邪恶的”,但是有许多“遗留”代码可以完成它并依赖它,所以你需要一个足够大的int大小来存储它。

将它们存储为整数可以让你做“安全”但不能用指针做的事情,比如当它们不属于同一范围时比较它们,以便在内存泄漏检查器中使用它们,等