【问题标题】:Using a typedef'd uint causes error, while "unsigned int" does not...?使用 typedef'd uint 会导致错误,而“unsigned int”不会...?
【发布时间】:2011-12-31 02:04:04
【问题描述】:

由于某种原因,当我在程序中将变量定义为“uint”而不是“unsigned int”时,它会出错。这看起来很奇怪,因为 uint 的类型定义为:

typedef unsigned int uint;

...所以我认为我可以互换使用这两者。更准确地说,我将返回“unsigned int”的函数的结果分配给一个uint变量,然后 在向量调整大小调用中使用该 uint ......此时它会出错。即,我的代码看起来像这样:

unsigned int getUInt()
{
    return 3;
}

int main(void) {
    vector<vector<float> > vectVect(100000);
    for(uint i = 0; i < vectVect.size(); ++i)
    {
        vector<float>& myVect = vectVect[i];
        uint myUnsignedInt = getUInt();
        myVect.resize(myUnsignedInt);
    }
    cout << "finished" << endl;
}

...错误所在的行是 myVect.resize 行。

显然,我已经有了解决方案,但我想了解为什么会发生这种情况,因为我很困惑。有人有什么想法吗?

PS - 如果有人认为这很重要,我在 fedora 15 上使用 gcc v4.1.2... 定义 uint 的包含文件是 /usr/include/sys/types.h。

【问题讨论】:

  • 每当您遇到错误时,您始终需要在问题中包含相关错误。
  • 您应该显示失败的真实代码。特别是 #include-s、using 声明等。而且 GCC 4.6 可能比 4.1 更符合标准。
  • as you can see here,在您提供的示例中不会发生错误(至少对于该版本的 gcc)。
  • 而且,gcc 4.3.4 也不会产生错误。
  • 该错误是运行时的段错误 - 经过进一步挖掘,我认为 typdef 是不相关的。未分配的内存被覆盖一定是某种问题,并且更改该 typedefjust 碰巧以某种随机方式更改了代码。不过,感谢您的反馈!

标签: c++ gcc typedef unsigned uint


【解决方案1】:

我的猜测是系统中还有另一个 uint。尝试将您的重命名为不寻常的名称,或者更好地将其包装在命名空间中。

namespace MY {
    typedef unsigned int uint;
}

for (MY::uint i = 0; ....

【讨论】:

  • 只是选择这个作为答案,因为这是一个很好的猜测,我从来没有弄清楚到底发生了什么......
【解决方案2】:

我的猜测是它试图形成某种“层次结构”。

换句话说,我们有:

typedef unsigned int size_t;
typedef unsigned int uint;

如果size_t 比通用unsigned int“更具体”,那么阻止它转换为uint 是有意义的,这可能比任何旧的unsigned int“更具体”。

我希望这是一个警告,如果有的话,不是错误......

【讨论】:

  • 我不这么认为。 typedef 为类型创建别名,而不是新类型。因此,鉴于上述声明,unsigned intsize_tuint 都是同一类型(unsignedint unsigned 也是如此)。
  • @KeithThompson:这就是应该发生的,我同意;我猜也许编译器不小心这样做了,但是 idk.
猜你喜欢
  • 2015-05-09
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
相关资源
最近更新 更多