Mac上的`cc -std = c99`和`c99`有什么区别? [英] What is the difference between `cc -std=c99` and `c99` on Mac OS?
问题描述
给定以下程序:
/ *查找低于1000的所有3或5的倍数的总和。
#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\\\
,sum);
} else {
printf(Error:Unsigned Integer Wrapping.\\\
);
}
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) c $ c> 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
错误:无符号整数换行。你可以解释一下这个行为吗?
$ b >解决方案
c99
是gcc
的包装器。它存在,因为POSIX需要它。c99
将默认生成一个32位(i386)二进制文件。
gcc
。gcc
默认情况下会在本机架构中生成一个二进制文件,即x86_64。
在OS X上的i386上为32位长,在x86_64上为64位长。因此,
c99
将有一个Unsigned Integer Wrapping,cc -std = c99
不会。 >
您可以强制
c99
在OS X上通过-W 64生成64位二进制
。c99 -W 64 proble1.c -o problem_1
(注意:
gcc
$ c> i686-apple-darwin10-gcc-4.2.1 。)Given the following program:
/* 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; }
On a Mac OS system (Xcode 3.2.3) if I use
cc
for compilation using the-std=c99
flag everything seems just right:nietzsche:problem_1 robert$ cc -std=c99 problem_1.c -o problem_1 nietzsche:problem_1 robert$ ./problem_1 Sum: 233333333166666668
However, if I use
c99
to compile it this is what happens:nietzsche:problem_1 robert$ c99 problem_1.c -o problem_1 nietzsche:problem_1 robert$ ./problem_1 Error: Unsigned Integer Wrapping.
Can you please explain this behavior?
解决方案
c99
is a wrapper ofgcc
. It exists because POSIX requires it.c99
will generate a 32-bit (i386) binary by default.
cc
is a symlink togcc
, so it takes whatever default configurationgcc
has.gcc
produces a binary in native architecture by default, which is x86_64.
unsigned long
is 32-bit long on i386 on OS X, and 64-bit long on x86_64. Therefore,c99
will have a "Unsigned Integer Wrapping", whichcc -std=c99
does not.You could force
c99
to generate a 64-bit binary on OS X by the-W 64
flag.c99 -W 64 proble1.c -o problem_1
(Note: by
gcc
I mean the actual gcc binary likei686-apple-darwin10-gcc-4.2.1
.)这篇关于Mac上的`cc -std = c99`和`c99`有什么区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!