c语言中不允许在函数外部给全局变量赋值
今天,在写条件编译的时候,出现了在函数外部给全局变量赋值的情况,gcc报错,那么c语言为什么不允许在函数外部给变量赋值呢?为什么声明变量的时候可以对变量进行赋值?
出错代码:
1 /* 2 * ===================================================================================== 3 * 4 * Filename: 2.c 5 * 6 * Description: 7 * 8 * Version: 1.0 9 * Created: 2014年10月30日 16时25分41秒 10 * Revision: none 11 * Compiler: gcc 12 * 13 * Author: 3me (), 14 * Organization: 15 * 16 * ===================================================================================== 17 */ 18 #include <stdlib.h> 19 #include <stdio.h> 20 int i = 0; 21 i = 3; 22 23 /* 24 * === FUNCTION ====================================================================== 25 * Name: main 26 * Description: 27 * ===================================================================================== 28 */ 29 int 30 main ( int argc, char *argv[] ) 31 { 32 printf("%d.\n", i ); 33 34 return EXIT_SUCCESS; 35 } /* ---------- end of function main ---------- */ 36 2.c 1,1 顶端 1 2.c|21 col 1| 警告: 数据定义时没有类型或存储类 [默认启用] 2 2.c|21 col 1| 警告: 在‘i’的声明中,类型默认为‘int’ [-Wimplicit-int] 3 2.c|21 col 1| 错误: ‘i’重定义 4 2.c|20 col 5| 附注: ‘i’的上一个定义在此 ~
思考:
在函数外部对变量的声明,是为了在编译阶段给程序分配内存空间,因此(在函数外部)声明变量的时候对变量进行赋值,只是对分配的内存空间进行初始化。但程序的内部,函数的调用顺序是无序的(并不是在文件中从上到下依次执行),如下图,因此,如果c的语法允许在函数外部对变量赋值,则变量的值是不可预测的。
2 * ===================================================================================== 3 * 4 * Filename: 3.c 5 * 6 * Description: 7 * 8 * Version: 1.0 9 * Created: 2014年10月30日 16时50分05秒 10 * Revision: none 11 * Compiler: gcc 12 * 13 * Author: 3me (), 14 * Organization: 15 * 16 * ===================================================================================== 17 */ 18 #include <stdlib.h> 19 #include <stdio.h> 20 int i = 0; 21 i = 1; 22 #include <stdlib.h> 23 /* 24 * === FUNCTION ====================================================================== 25 * Name: main 26 * Description: 27 * ===================================================================================== 28 */ 29 int 30 main ( int argc, char *argv[] ) 31 { 32 i++; 33 fun1(); 34 return EXIT_SUCCESS; 35 } /* ---------- end of function main ---------- */ 36 /* 37 * === FUNCTION ====================================================================== 38 * Name: fun1 39 * Description: 40 * ===================================================================================== 41 */ 42 i = 2; 43 void 44 fun1 ( <+argument list+> ) 45 { 46 i = 3; 47 return <+return value+>; 48 } /* ----- end of function fun1 ----- */ 49 "3.c" 49L, 1215C 已写入