Mac OS 上的 `cc -std=c99` 和 `c99` 有什么区别?

问题描述 投票:0回答:2

给出以下程序:

/*  Find the sum of all the multiples of 3 or 5 below 1000. */

#include <stdio.h>

unsigned long int method_one(const unsigned long int n);

int
main(int argc, char *argv[])
{
        unsigned long int sum = method_one(1000000000);
        if (sum != 0) {
                printf("Sum: %lu\n", sum);
        } else {
                printf("Error: Unsigned Integer Wrapping.\n");
        }

        return 0;
}

unsigned long int
method_one(const unsigned long int n)
{
        unsigned long int i;
        unsigned long int sum = 0;
        for (i=1; i!=n; ++i) {
                if (!(i % 3) || !(i % 5)) {
                        unsigned long int tmp_sum = sum;
                        sum += i;
                        if (sum < tmp_sum)
                                return 0;
                }
        }

        return sum;
}

在 Mac OS 系统(Xcode 3.2.3)上,如果我使用

cc
进行编译,使用
-std=c99
标志,一切似乎都正确:

nietzsche:problem_1 robert$ cc -std=c99 problem_1.c -o problem_1
nietzsche:problem_1 robert$ ./problem_1 
Sum: 233333333166666668

但是,如果我使用

c99
来编译它,就会发生以下情况:

nietzsche:problem_1 robert$ c99 problem_1.c -o problem_1
nietzsche:problem_1 robert$ ./problem_1 
Error: Unsigned Integer Wrapping.

您能解释一下这种行为吗?

c xcode c99
2个回答
14
投票

c99
gcc
的包装。它的存在是因为 POSIX 需要它。
c99
默认情况下会生成 32 位 (i386) 二进制文件。

cc
gcc
的符号链接,因此它采用
gcc
的任何默认配置。
gcc
默认在本机架构中生成二进制文件,即x86_64。

unsigned long
在 OS X 上的 i386 上为 32 位长,在 x86_64 上为 64 位长。因此,
c99
将具有“无符号整数环绕”,而
cc -std=c99
则没有。

您可以通过

c99
标志强制
-W 64
在 OS X 上生成 64 位二进制文件。

c99 -W 64 proble1.c -o problem_1

(注:

gcc
我指的是实际的gcc二进制文件,如
i686-apple-darwin10-gcc-4.2.1
。)


5
投票

在 Mac OS X 下,cc 是 gcc 的符号链接(默认为 64 位),而 c99 不是(默认为 32 位)。

/usr/bin/cc -> gcc-4.2

他们对数据类型使用不同的默认字节大小。

/** sizeof.c
 */
#包括
#包括

int main(int argc, char *argv)
{
   printf("sizeof(无符号长整型)==%d
“,(int)sizeof(无符号长整型));

   返回退出_成功;
}

cc -std=c99 sizeof.c
./a.输出
sizeof(无符号长整型)==8


c99 sizeof.c
./a.输出
sizeof(无符号长整型)==4

很简单,当使用 c99 编译器时,你会溢出(也称为包装)你的整数变量。

.PMCD。

© www.soinside.com 2019 - 2024. All rights reserved.