首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C基础,该如何解决

2014-01-12 
C基础刚刚入门C语言,写了个例子如下:main.c代码如下:int main(int argc, char *argv[]){foo()return 0}a

C基础
刚刚入门C语言,写了个例子如下:
    main.c代码如下:
    int main(int argc, char *argv[]){
        foo();
        return 0;
    }
    a.c代码如下:
    void foo(){
    }
其中main.c与a.c都在同一个目录
命令行执行如下命令:
     gcc main.c a.c -o main
编译通过,运行生成的main也不报错。
我想问的问题是main.c代码中并没有引入a.c啊,为什么编译的main.c的main()方法调用foo()方法不报错呢,
运行也不报错。
[解决办法]
相当于
gcc -c main.c -o main.o
gcc -c a.c -o a.o
gcc main.o a.o -o main
[解决办法]
你的gcc明明写了两个.c文件,两个.c文件都编译成了main文件,怎么会报错?
gcc f1.c f2.c -o out
会把f1.c和f2.c都编译并且连接成out文件。你的main函数以及main调用的函数在这两个文件里都能找到,为什么要报错?
[解决办法]

引用:
Quote: 引用:

相当于
gcc -c main.c -o main.o
gcc -c a.c -o a.o
gcc main.o a.o -o main


还是不明白main()方法怎么把foo()方法引用到的?是编译完了直接就会把foo()方法跟main()方法关联吗?
能够解释下吗?


理解link动作是做什么
[解决办法]
首先,c和java是两门不同的语言,所以“main.c的main()方法里面没有引入a.c的foo()方法应该编译都通不过”这种想法以后不要再有了,没有什么应该不应该,只有语言标准
然后,c语言的不同文件在编译时分别编译为不同模块,所有模块最终链接为可执行文件,如果没有特别声明,所有全局变量和函数都可以在模块外通过名字直接访问,所以不同模块中不能有同名的全局变量和函数。如果想要使用同名的全局变量和函数,就用关键字static声明为内部,这样这个变量和函数对模块外来说就是不可见的,自然也就不会报冲突错误

热点排行