读书人

【C语言】相干gcc优化和全局变量的疑惑

发布时间: 2013-11-14 22:02:51 作者: rapoo

【C语言】有关gcc优化和全局变量的疑惑
现有文件main.c fun.c fun.h,编译环境ubuntu10.10,gcc-4.4.3。
main.c


#include <stdio.h>
#include "fun.h"

int a;
int main(void)
{
fun();

printf("[main] &a = %p\n", &a);
printf("[main] a = 0x%X\n", a);
}


fun.c

#include <stdio.h>
#include "fun.h"

int a;
void fun(void)
{
a = 0xff;

printf("[fun] &a = %p\n", &a);
printf("[fun] a = 0x%X\n", a);
}


fun.h

#ifndef _FUN__H
#define _FUN__H

void fun(void);

#endif


编译:gcc -o main main.c fun.c(无警告无错)
执行:./main
结果:
[fun] &a = 0x804a01c
[fun] a = 0xFF
[main] &a = 0x804a01c
[main] a = 0xFF

请问:定义了两个全局变量a,为什么在连接的过程中,连接器没有报重复定义的错呢?
ps:我是看了《C陷阱与缺陷》书 “【第4章 连接】 4.2声明与定义”做的实验。
c 优化 c语言 全局变量 gcc
[解决办法]
#include <stdio.h>
#include <stdlib.h>

int a= 2;
int a;
int main()
{
printf("%d\n",a);
printf("Hello world!\n");
return 0;
}
可以通过编译
#include <stdio.h>
#include <stdlib.h>

int a;
int a = 2;
int main()
{
printf("%d\n",a);
printf("Hello world!\n");
return 0;
}
也可以通过编译
#include <stdio.h>
#include <stdlib.h>

int a = 5 ;
int a = 4;
int main()
{
printf("%d\n",a);
printf("Hello world!\n");
return 0;
}
错误不可以通过编译
说明int a; 在作为全局变量的时候 只有在用与赋值的时候 才是真正意义上的定义
所以不会报重复定义
[解决办法]
要加上 -Wredundant-decls选项才会警告,默认是关闭的:

gcc -Wredundant-decls -o main main.c fun.c


引用:
现有文件main.c fun.c fun.h,编译环境ubuntu10.10,gcc-4.4.3。
main.c

#include <stdio.h>
#include "fun.h"

int a;
int main(void)
{
fun();

printf("[main] &a = %p\n", &a);
printf("[main] a = 0x%X\n", a);
}


fun.c

#include <stdio.h>
#include "fun.h"

int a;
void fun(void)
{
a = 0xff;

printf("[fun] &a = %p\n", &a);
printf("[fun] a = 0x%X\n", a);
}


fun.h

#ifndef _FUN__H
#define _FUN__H

void fun(void);

#endif


编译:gcc -o main main.c fun.c(无警告无错)
执行:./main
结果:
[fun] &a = 0x804a01c
[fun] a = 0xFF
[main] &a = 0x804a01c
[main] a = 0xFF

请问:定义了两个全局变量a,为什么在连接的过程中,连接器没有报重复定义的错呢?
ps:我是看了《C陷阱与缺陷》书 “【第4章 连接】 4.2声明与定义”做的实验。

[解决办法]
这个应该和GCC参数有关!就像你说的那样,优化了!全局变量都是放在data段中,是容的不得重复的!
[解决办法]
一般选离自己最近的变量

读书人网 >C语言

热点推荐