zoukankan      html  css  js  c++  java
  • 2)#ifndef和#pragma once

    ##########################################################################################################

    新的理解:

      

      

     然后我的wangchao.h文件内容

     1 //防止头文件重复包含
     2 #pragma once
     3  //我的这个是C语言代码,但是以后,我可能把我的这个C语言代码和C++融合在一起,那么
     4 //我就得兼容C++编译器
     5 
     6 
     7 //当前如果是C++编译器,就按照C编译器编译
     8 
     9 #ifdef __cplusplus//这个是C语言编译器已经有的一个宏
    10 
    11 //如果当前是C语言编译器,想按照C++标准编译
    12 extern "C"
    13 {
    14 
    15 #endif
    16     //但是上面有半个括号,要是代码很多的话,很容易发生问题,所以  我们一般再加了下面的代码。
    17 
    18 
    19 
    20     //中间写你的函数声明,就是你的接口。
    21     void hanshu();
    22 
    23 
    24 
    25     //下面的是应该加的代码
    26 #ifdef __cplusplus
    27     }
    28 #endif

    我的b.c的代码:

    1 #include"wangchao.h"
    2 
    3 void hanshu()
    4 {
    5     printf("你获得赛点
    ");
    6 }

    我的a.c的代码

    1 //函数的实现
    2 #include<stdio.h>
    3 #include"wangchao.h"
    4 int main()
    5 {
    6     printf("jldksajf
    ");
    7     hanshu();
    8     return 0;
    9 }

    为啥,我在a.c中调用wangchao.h  就能使用那个hanshu()  ?

    比方说 我在aaa.h里定义了一个函数的声明,然后我在aaa.h的同一个目录下建立aaa.c , aaa.c里定义了这个函数的实现,然后是在main函数所在.c文件里#include这个aaa.h 

    然后我就可以使用这个函数了。 main在运行时就会找到这个定义了这个函数的aaa.c文件。这是因为:main函数为标准C/C++的程序入口,编译器会先找到该函数所在的文件。

    假定编译程序编译myproj.c(其中含main())时,发现它include了mylib.h(其中声明了函数void test()),那么此时编译器将按照事先设定的路径(Include路径列表及代码文件所在的路径)查找与之同名的实现文件(扩展名为.cpp或.c,此例中为mylib.c),如果找到该文件,并在其中找到该函数(此例中为void test())的实现代码,则继续编译;

    如果在指定目录找不到实现文件,或者在该文件及后续的各include文件中未找到实现代码,则返回一个编译错误.

    其实include的过程完全可以“看成”是一个文件拼接的过程,将声明和实现分别写在头文件及C文件中,或者将二者同时写在头文件中,理论上没有本质的区别。以上是所谓动态方式。

    http://www.cnblogs.com/infiniti/archive/2013/03/19/2968689.html

    ###############################################################################################

    首先是  我创建多个.c和.h文件   然后他们的目录关系是:

          

     在 b.h中的内容

    1 #include"c.h"
    2 
    3 void hanshu();

    在c.h中的内容

    1 #include"b.h"
    2 
    3 void hanshu1();

    在b.c中的内容

    1 void hanshu()
    2 {
    3     printf("你获得赛点
    ");
    4 }

    在c.c中的内容

    1 void hanshu1()
    2 {
    3     hanshu();
    4     printf("我是CCCC");
    5 }

    在a.c中内容

    1 //函数的实现
    2 #include<stdio.h>
    3 #include"c.h"
    4 int main()
    5 {
    6     printf("jldksajf
    ");
    7     hanshu1();
    8     return 0;
    9 }

      很明显,我的代码中,在b的代码中包含c,在c的代码中包含b。然后 在我调用那个c中的函数hanshu1()时,就会报错

    然后  我加了改动

        

    在c.h中,我加了这个:

        

      然后  就可以通过了。

    ##############################################################################################3

    接着上面的问题,我想在我的.cpp文件中用刚刚的那个c,h文件,于是 我的b.h   b.c  c.c  c.h代码没动,aa.cpp中的代码是

    1 //函数的实现
    2 #include<stdio.h>
    3 #include"c.h"
    4 int main()
    5 {
    6     printf("jldksajf
    ");
    7     hanshu1();
    8     return 0;
    9 }

     但是  不行  会报错。

    于是  我加了下面的改动:

        

    我的那个b.h的改动是:
        

      然后就可以运行了,所以  你现在知道  为啥  多文件时,要加上面的代码,  这就是来由。

  • 相关阅读:
    用 Python 带你看各国 GDP 变迁
    Fluent Interface(流式接口)
    probing privatePath如何作用于ASP.NET MVC View
    Word插入htm文件导致文本域动态增加的一个问题
    Visual Studio 2013附加进程调试IE加载的ActiveX Control无效解决方法
    Ubuntu下Chrome运行Silverlight程序
    Windows Phone Bing lock screen doesn't change解决方法
    SPClaimsUtility.AuthenticateFormsUser的证书验证问题
    Web Service Client使用Microsoft WSE 2.0
    Visual Studio 2013安装Update 3启动crash的解决方法
  • 原文地址:https://www.cnblogs.com/xiaoyoucai/p/8007234.html
Copyright © 2011-2022 走看看