gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 14:51:05 25 4
gpt4 key购买 nike

给定以下程序:

/*  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.

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

最佳答案

c99 is a wrapper of gcc .它存在是因为 POSIX 需要它。 c99 将默认生成 32 位 (i386) 二进制文件。

cc is a symlink to gcc ,因此它采用 gcc 具有的任何默认配置。 gcc 默认生成原生架构的二进制文件,即 x86_64。

unsigned long 在 OS X 上的 i386 上是 32 位长,在 x86_64 上是 64 位长。因此,c99 将具有“Unsigned Integer Wrapping”,而 cc -std=c99 则没有。

您可以通过 -W 64 标志强制 c99 在 OS X 上生成 64 位二进制文​​件。

c99 -W 64 proble1.c -o problem_1

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

关于c - Mac OS 上的 `cc -std=c99` 和 `c99` 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4182413/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com