Mac上的`cc -std = c99`和`c99`有什么区别? [英] What is the difference between `cc -std=c99` and `c99` on Mac OS?

查看:793
本文介绍了Mac上的`cc -std = c99`和`c99`有什么区别?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

给定以下程序:

  / *查找低于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)二进制文件。



cc 是一个指向<$ c的符号链接$ c> gcc ,因此它需要任何默认配置 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 of gcc. It exists because POSIX requires it. c99 will generate a 32-bit (i386) binary by default.

cc is a symlink to gcc, so it takes whatever default configuration gcc 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", which cc -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 like i686-apple-darwin10-gcc-4.2.1.)

这篇关于Mac上的`cc -std = c99`和`c99`有什么区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆