zoukankan      html  css  js  c++  java
  • linux GCC编译C程序的问题

    今天下午突然觉得C里面有个地方比较模糊,一种莫名的恐惧产生,如是做两个实验

    有三个文件hello.c , hello.h, main.c

    代码如下:

    文件hello.h

    #include<stdio.h>
    int sayhello(char* str)
    {
     printf("%s \n",str);
     return 0;
    }
    这个里面申明并定义了一个函数sayhello

    文件hello.c

    #include<stdio.h>
    int sayhello(char* str)
    {
     printf("%s \n",str);
     return 0;
    }
    内容和hello.h一样,也是定一个函数sayhello

    文件main.c

    #include<stdio.h>
    #include"hello.h"
    int main(void)
    {
     char * str="hello";
     sayhello(str);
     return 0;
    }

    下面是编译测试(一):guoyuanwei@ubuntu:~/文档$ gcc -Wall main.c  hello.c -o hello
    main.c: In function ‘main’:
    main.c:5: warning: implicit declaration of function ‘sayhello’

    显示1个警告,隐式定义了函数sayhello,但能正确运行。

    测试(二):guoyuanwei@ubuntu:~/文档$ gcc -Wall main.c  hello.h -o hello
    main.c: In function ‘main’:
    main.c:5: warning: implicit declaration of function ‘sayhello’
    /tmp/cc3NGyXC.o: In function `main':
    main.c:(.text+0x1d): undefined reference to `sayhello'
    collect2: ld returned 1 exit status

    有个错误,意思是main.c中的函数sayhello没有定义,但是hello.h和hello.c的内容所完全一样的,实验一中却没有,这是为什么?

    测试(三):首先将main.c文件改为:也就是加上一个头文件。

    #include<stdio.h>
    #include"hello.h"
    int main(void)
    {
     char * str="hello";
     sayhello(str);
     return 0;
    }

    编译:guoyuanwei@ubuntu:~/文档$ gcc -Wall main.c -o hello
    一个错误和警告都没有,这是因为GCC在编译C源文件的时候,会根据#include包含相应的内容进来
    但是实验一、二就比较诡异了,难道GCC编译的时候,对hello.h和hello.c处理方式不一样?自动抛弃了hello.h文件,是不是只要.h的头文件都不会编译进来。GCC编译文件的时候难道看的是文件的后缀名而不是文件的内容吗?

  • 相关阅读:
    CF799B T-shirt buying
    luogu3469 [POI2008]BLO_Blockade
    luogu2746 校园网
    USACO 2.2 Party Lamps 【高能等效+规律枚举】
    USACO 2.2 Subset Sums 【经典的方案DP+必要的转化】
    USACO 2.2 Preface Numbering 【实质是分治思想】
    bzoj 1051: [HAOI2006]受欢迎的牛 (Tarjan 缩点)
    bzoj 1088: [SCOI2005]扫雷Mine
    bzoj 2761: [JLOI2011]不重复数字 (map||Treap)
    bzoj 1230: [Usaco2008 Nov]lites 开关灯
  • 原文地址:https://www.cnblogs.com/guoyuanwei/p/2469927.html
Copyright © 2011-2022 走看看