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的改动是:
        

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

  • 相关阅读:
    SQL面试题集合
    绕过UAC提示以管理员身份运行程序
    一个在VS2010中不能加载项目的问题
    Windows下硬链接、软链接和快捷方式的区别
    自动化测试中FindWindow与FindWindowEx的使用示例
    在C#中调用批处理文件
    windows的自动登陆问题
    PowerShell操作XML遇到的问题
    MySQL集群MGR架构for单主模式
    MySQL集群MGR架构for多主模式
  • 原文地址:https://www.cnblogs.com/xiaoyoucai/p/8007234.html
Copyright © 2011-2022 走看看