【问题标题】:unnecessary (?) Xcode warning不必要的 (?) Xcode 警告
【发布时间】:2009-10-23 20:56:20
【问题描述】:

我在 Core 2 Duo 上的 OS X 10.6 中运行 Xcode。这是一个简短的程序:

#include <stdio.h>

int main () {
    long a = 8589934592L;
    printf("a = %li\n", a);
    return 0;
}

当我从命令行 (gcc -pedantic) 编译它时,我没有收到任何错误或警告。当我在调试配置中的 Xcode 中编译它时,我没有收到任何错误或警告。当我在 Xcode 中的发布配置中编译它时,我收到一个警告:“隐式常量转换中的溢出”。

Long 应该是 64 位。并且程序运行良好。那么这是怎么回事,我该如何消除这个警告呢?

【问题讨论】:

    标签: xcode macos warnings compiler-warnings


    【解决方案1】:

    检查sizeof(long)sizeof(long long),看看您关于long 是64 位类型的假设是否正确。

    我刚刚在 Mac OS X 10.6.1 上使用 Xcode 3.2.1 试用了您的程序,但没有收到该警告。我确实设法通过将目标配置设置为“32 位通用”而不是“标准 32/64 位通用”来获得警告。确保您正在构建正确的机器类型!

    【讨论】:

    • 抱歉,应该解释一下:OS X 使用 LP64 数据模型(请参阅 developer.apple.com/macosx/64bit.html ),其中 long 是 64 位的。
    • 我猜有一些 Xcode 项目设置表明您正在制作 32 位安全代码。
    • 谢谢 Carl --- 是的,这就是问题所在。我是 Xcode 的新手,直到在这里得到提示后才找到该设置。
    • @Everett:64 位架构上的 Mac OS X 可以做到这一点。 32 位架构上的 Mac OS X 将 long 定义为 32 位。这就是为什么,正如 Rüdiger Hanke 在他的回答中解释的那样,您只会在构建一个或多个 32 位架构时收到警告,就像您在发布版本中构建所有架构时一样,而不是在构建活动版本时(大概是 64- bit) 单独在 Debug 构建中的架构。
    【解决方案2】:

    在构建设置中,选中“架构”。如果这是“标准(32/64 位通用)”,则将构建具有 32 位和 64 位版本的通用二进制文件。警告是针对 32 位构建的。

    您看到的区别在于“仅构建活动架构”在调试配置中被选中,而不是在发布配置中。所以在 64 位上编译 Debug 时没有构建 32 位版本,因此没有警告。

    【讨论】:

    • 啊!谢谢!这正是问题所在。
    【解决方案3】:

    这里的问题是 long 是 32 位的,而不是 64 位的。long long 是 64 位的。

    在运行 10.6 的 Mac Pro 上

    #include <stdio.h>
    int main() {
        printf("%d.\n", sizeof(long));
        printf("%d.\n", sizeof(long long));
    
    }
    

    输出

    4.
    8.
    

    【讨论】:

    • 正如 Rüdiger 指出的那样,这取决于构建设置。如果选择项目并获取信息,则可以将架构设置为 32 位通用、64 位 Intel 或默认的 32/64 位通用。根据您的选择,您在上面包含的程序将提供不同的输出...
    猜你喜欢
    • 2013-03-17
    • 2023-03-05
    • 2011-04-01
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多