【问题标题】:Define the default int to unsigned int将默认 int 定义为 unsigned int
【发布时间】:2012-01-03 21:25:50
【问题描述】:

我如何(如果可以)将默认 int 变量(在特定程序中)设置为 unsigned int?

我的意思是,如果int写在程序中,编译器会把它当作unsigned int

我的编译器是 gcc 4.6.2

编辑:我无权触摸代码。

【问题讨论】:

  • 不确定这是否是个好主意...但也许是一个宏?
  • 你真的不应该那样做。
  • 这似乎是一个非常糟糕的主意。
  • 这是因为懒惰吗?因为,您知道,您可以使用简单的typedef unsigned int uint; 来节省您的打字时间。
  • @yoni:你为什么要这么做?如果您确切地告诉我们您想要实现什么,也许我们可以提供更好的帮助(因为可能有比重新定义int 更好的方法,这势必会导致问题)。

标签: c++ gcc compiler-construction int unsigned


【解决方案1】:

您无法更改 int 的默认签名,因为它根据定义是有符号类型(第 6.2.5/4 节)。考虑必须返回类型int(§5.1.2.2.1/1)的main 函数,如果您以某种方式更改默认签名,则main 将返回unsigned int,这将导致未定义的行为,呈现你的整个应用程序相对没用。

你不能创建宏,因为如果int 扩展为unsigned int,那么如果你在某处声明了unsigned int,你最终会得到unsigned unsigned int,这不是一个有效的类型。

【讨论】:

  • 哎呀,对不起,问题被标记为 C++,但我引用了 C 规范中的条款,但我或多或少坚持同样的限制也适用于 C++。
  • 谢谢,现在我明白了这个问题。为什么有些人很难回答这个(或喜欢这个)简单的答案。为什么要回答超级邪恶的答案?为什么?
【解决方案2】:

超级恶魔

#define int unsigned int

可以工作,但绝对不符合标准,您可能需要让编译器不那么严格(这是一件坏事)。

您可以做的其他事情是查找并替换所有出现的int(前面没有unsigned),然后用my_typedefed_int 替换它们并添加一个

typedef unsigned int my_typedefed_int

这符合标准,但涉及更多,可能不可能。

【讨论】:

  • 第二个建议的目的究竟是什么?那么他也可以将所有出现的int 替换为unsigned int
  • Niklas:它将允许以简单透明的方式使用/测试其他类型。
  • @Niklas Baumstark:根据第二个建议,一旦 op 意识到对所有事情都使用 unsigned int 是一个坏主意,他将能够通过修改一行代码来全局切换类型(到 int)——而不是对整个项目使用大量搜索/替换。
  • @SigTerm:好的,有道理:D
  • 第一个建议可能不应该被建议。我怀疑在预处理器宏中重新定义该语言的关键字是否合法,但即使这是可能的问题是,如果某些翻译单元编译为/如果没有定义该宏,您将在代码中具有不同的语义、函数的声明/定义不一致甚至 ODR 违规(考虑内联函数)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
  • 2019-05-02
  • 2016-02-26
相关资源
最近更新 更多