精华内容
下载资源
问答
  • C语言引用头文件

    千次阅读 2019-09-12 14:59:08
    今天写一个解决的关于C语言extern的相关的问题 怎么使用C语言的extern ? 为什么我的VC++6.0报错,“找不到我建的头文件”? 1、自己建的头文件用英文的 “”。 2、检查你使用的编译器,他会自己处理头文件的的...

    今天写一个解决的关于C语言extern的相关的问题

    怎么使用C语言的extern ?
    为什么我的VC++6.0报错,“找不到我建的头文件”?

    1、自己建的头文件用英文的 “”。
    2、检查你使用的编译器,他会自己处理头文件的的路径么?
    比如下面我的不会处理。我都是自己处理。自己建文件夹,自己在include的时候写正确的相对路径。(也可以是绝对路径)。
    3、文件名要一致。

    1、C语言的extern的用法(简单介绍几点)。

    1、extern关键字表示这个标识符具有External Linkage。
    2、变量extern不可以缺省。
    3、函数extern可以缺省。
    4、凡是被多次声明的变量或函数,必须有且只有一个声明是定义,如果有多个定义,或者一个定义都没有,链接器就无法完成链接。
    

    我的环境是Mac,使用的是VSCode。
    问我问题的同学的环境是win,VC++6.0。

    VSCode不会处理头文件路径问题。我都是自己处理。自己建文件夹,自己在include的时候写正确的相对路径。(也可以是绝对路径)。
    VC++6.0 是建一个项目,其中有头文件和源文件这两个文件夹。所以你在源文件(.c)中写头文件 (.h)文件的文件名就可以了

    这是我的
    在这里插入图片描述
    test1.h

    #ifndef TEST1_H
    #define TEST1_H
    
    int a = 1, b = 2, c = 3;
    
    #endif
    

    test1.c

    #include <stdio.h>
    #include "../head/test1.h"//我现在是在test1.c里面,test1.h文件在我的上层目录head文件夹中。
    
    extern int a, b, c;
    int main(int argc, char *argv[]) {
        printf("a + b = %d\n", (a+b));
        return 0;
    }
    
    展开全文
  • C语言基础专题 - 头文件引用 本文介绍了C语言中头文件的引用方法 阅读本文前推荐阅读C语言预处理 - 由于博主水平有限,疏忽在所难免。若发现错误请告知博主更正:李俊才 ...如何引用头文件? 这个事情我们

    C语言基础专题 - 头文件引用


    本文介绍了C语言中头文件的引用方法
    阅读本文前推荐阅读C语言预处理

    1.🧐什么是头文件?

    头文件是扩展名为 .h 的文件,这是一个文本文件,内容包含了:

    2.🧐如何引用头文件?

    这个事情我们所有人写的第一个程序Hello World.c中都做过:

    #include <stdio.h>     // 引用头文件
    int main(){
       printf("Hello World")
    }
    

    这里被引用的头文件stdio.h它是编译器自带的,属于系统头文件。
    我们不但可以引用系统头文件,也可以引用自己写的头文件,即用户头文件,但这再语法上由略微差别:

    #include <file>    //  用于引用名为file的系统头文件,默认在系统目录的标准列表中搜索该文件
    #include "file"     //  用于引用名为file的用户头文件 ,默认在包含当前文件的目录中搜索该文件
    

    C语言的编译器有很多,对于以上两种使用头文件的方法一般都提供了相关选项以加入搜索头文件的路径,也常有在名为INCLUDE环境变量中加入搜索路径,以告诉编译器头文件的位置。

    比如,在GCC中(以下引用内容摘录自GCC官方文档3.16目录搜索的选项章节,有外语基础的读者可以自行阅读。)

    这些选项指定目录以搜索头文件,库和编译器的一部分:

    -I dir
    -iquote dir
    -isystem dir
    -idirafter dir
    

    它们在预处理(可以参考C语言预处理部分内容)的时候将目录dir添加到要在预处理过程中搜索头文件的目录列表中。如果dir以'='或>$SYSROOT,然后是'='或被$SYSROOTsysroot前缀替换;看到 --sysroot->isysroot

    指定的目录 -I 引用仅适用于指令的引号形式。指定的目录#include "file" -I-isystem,或者 -idirafter适用于 #include "file"#include <file>指令的查找 。
    您可以在命令行上指定任何数目或这些选项的组合,以在多个目录中搜索头文件。查找顺序如下:

    • (1)对于include指令的引号形式,将首先搜索当前文件的目录。
    • (2)对于include指令的引号形式,目录由 -我引用 选项在命令行中按从左到右的顺序搜索。
    • (3)指定目录 -I 选项以从左到右的顺序扫描。
    • (4)指定目录 -isystem 选项以从左到右的顺序扫描。
    • (5)扫描标准系统目录。
    • (6)指定目录 -idirafter 选项以从左到右的顺序扫描。

    您可以使用 -I覆盖系统头文件,替代您自己的版本,因为这些目录是在标准系统头文件目录之前搜索的。但是,您不应使用此选项来添加包含供应商提供的系统头文件的目录。采用-isystem为了那个原因。
    -isystem-idirafter 选项还将该目录标记为系统目录,以便对它进行与标准系统目录相同的特殊处理。

    如果标准系统包含目录,或使用以下命令指定的目录 -isystem,也指定了 -I-I 选项将被忽略。该目录仍在搜索,但作为系统目录位于系统包含链中的正常位置。这是为了确保#include_next不会错误地更改GCC修正错误的系统头的过程以及该指令的顺序。如果您确实需要更改系统目录的搜索顺序,请使用-nostdinc 和/或 -isystem 选项。

    3.🧐头文件中有一般写了什么?

    如果想自己写一个头文件,那还是有必要了解一下头文件的内容的。我们不妨先打开我们从写HelloWorld.c就开始使用的stdio.h一探究竟。

    /* Checking macros for stdio functions.
       Copyright (C) 2004, 2005, 2009 Free Software Foundation, Inc.
    
    This file is part of GCC.
    
    GCC is free software; you can redistribute it and/or modify it under
    the terms of the GNU General Public License as published by the Free
    Software Foundation; either version 3, or (at your option) any later
    version.
    
    In addition to the permissions in the GNU General Public License, the
    Free Software Foundation gives you unlimited permission to link the
    compiled version of this file into combinations with other programs,
    and to distribute those combinations without any restriction coming
    from the use of this file.  (The General Public License restrictions
    do apply in other respects; for example, they cover modification of
    the file, and distribution when not linked into a combine
    executable.)
    
    GCC is distributed in the hope that it will be useful, but WITHOUT ANY
    WARRANTY; without even the implied warranty of MERCHANTABILITY or
    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    for more details.
    
    Under Section 7 of GPL version 3, you are granted additional
    permissions described in the GCC Runtime Library Exception, version
    3.1, as published by the Free Software Foundation.
    
    You should have received a copy of the GNU General Public License and
    a copy of the GCC Runtime Library Exception along with this program;
    see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
    <http://www.gnu.org/licenses/>.  */
    
    
    #ifndef _SSP_STDIO_H
    #define _SSP_STDIO_H 1
    
    #include <ssp.h>
    #include_next <stdio.h>
    
    #if __SSP_FORTIFY_LEVEL > 0
    
    #include <stdarg.h>
    
    #undef sprintf
    #undef vsprintf
    #undef snprintf
    #undef vsnprintf
    #undef gets
    #undef fgets
    
    extern int __sprintf_chk (char *__restrict__ __s, int __flag, size_t __slen,
    			  __const char *__restrict__ __format, ...);
    extern int __vsprintf_chk (char *__restrict__ __s, int __flag, size_t __slen,
    			   __const char *__restrict__ __format,
    			   va_list __ap);
    
    #define sprintf(str, ...) \
      __builtin___sprintf_chk (str, 0, __ssp_bos (str), \
    			   __VA_ARGS__)
    #define vsprintf(str, fmt, ap) \
      __builtin___vsprintf_chk (str, 0, __ssp_bos (str), fmt, ap)
    
    extern int __snprintf_chk (char *__restrict__ __s, size_t __n, int __flag,
    			   size_t __slen, __const char *__restrict__ __format,
    			   ...);
    extern int __vsnprintf_chk (char *__restrict__ __s, size_t __n, int __flag,
    			    size_t __slen, __const char *__restrict__ __format,
    			    va_list __ap);
    
    #define snprintf(str, len, ...) \
      __builtin___snprintf_chk (str, len, 0, __ssp_bos (str), __VA_ARGS__)
    #define vsnprintf(str, len, fmt, ap) \
      __builtin___vsnprintf_chk (str, len, 0, __ssp_bos (str), fmt, ap)
    
    extern char *__gets_chk (char *__str, size_t);
    extern char *__SSP_REDIRECT (__gets_alias, (char *__str), gets);
    
    extern inline __attribute__((__always_inline__)) char *
    gets (char *__str)
    {
      if (__ssp_bos (__str) != (size_t) -1)
        return __gets_chk (__str, __ssp_bos (__str));
      return __gets_alias (__str);
    }
    
    extern char *__SSP_REDIRECT (__fgets_alias,
    			     (char *__restrict__ __s, int __n,
    			      FILE *__restrict__ __stream), fgets);
    
    extern inline __attribute__((__always_inline__)) char *
    fgets (char *__restrict__ __s, int __n, FILE *__restrict__ __stream)
    {
      if (__ssp_bos (__s) != (size_t) -1 && (size_t) __n > __ssp_bos (__s))
        __chk_fail ();
      return __fgets_alias (__s, __n, __stream);
    }
    
    #endif /* __SSP_FORTIFY_LEVEL > 0 */
    #endif /* _SSP_STDIO_H */
    

    可以看到:

    • 写在最前边的一般是文件内容概述(该文件为检查标准函数的宏(Checking macros for stdio functions.))、版权说明等。
    • 对于程序预处理与之后编译实质内容时后面的c代码,这些代码一般是从以前中写在源文件最前面(头部)的位置,我们将这些代码摘出来,因此叫做头文件。
    • 该文件中还引入了大量其它的头文件。
    • 除此之外我们还看到了大量的extern有关的语句,extern用于调用另一个c文件里的变量或者函数。

    4.👨‍🏫条件引用

    更多相关指令可以参考:C语言-预处理

    这里我们先了解下面这几条预处理指令:

    指令说明
    #if如果给定条件为真,则执行预处理的内容
    #else表示#if后的条件为假时执行预处理的内容
    #elif如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码
    #endif结束一个 #if……#else 条件编译块

    比如:

    #if CONDITION_1              // 若第1个条件成立
       # include "headfile_1.h"  // 引入头文件"headfile_1.h"
    #elif CONDITION_2            // 若第2个条件成立
       # include "headfile_2.h"  // 引入头文件"headfile_2.h"
       ...
    #endif                       // 条件指令的结束
    

    5.👨‍🏭用宏定义确保单次引用

    在C语言中提供了以下两个指令:

    指令说明
    #ifdef如果宏已经定义,则返回真
    #ifndef如果宏没有定义,则返回真

    为了防止由于多次头文件多次引用导致某些情况下产生错误,我们需要使用上面两个指令。请看代码:

    #ifndef A                        //  当没有宏定义A时
    #define A  包含所有头文件的文件B   // 宏定义A为包含所有头文件的文件B 
    #endif                           // 用于结束一个 #if……#else 条件编译块
    

    为了防止意外,而把头文件的内容都放在#ifndef#endif指令块中。这样作无论头文件会不会被多个文件引用,也就是当再次引用到头文件HeadFileB时,条件为假。

    展开全文
  • C语言引用头文件使用的符号有两种,以头文件stdio.h为例:(1)#include (2)#include “stdio.h”这两种引用方式是存在不同的。第一种引用方式,编译器仅在标准库头文件中进行匹配;第二种引用方式,编译器先在工程...

    C语言引用头文件使用的符号有两种,以头文件stdio.h为例:

    (1)#include

    (2)#include “stdio.h”

    这两种引用方式是存在不同的。

    第一种引用方式,编译器仅在标准库头文件中进行匹配;

    第二种引用方式,编译器先在工程目录下进行匹配,如果没有,再到标准库头文件中查找。

    这里进行了测试,应用VC++6.0,新建文件,首先是主文件Test.c:

    #include

    voidmain()

    {

    Test();

    }

    然后,为了简化过程,只建立一个头文件,并直接在头文件内部放入函数实体,child.h:

    #include

    voidTest()

    {

    printf("Hello World!\n");

    }

    嗯!程序报错,错误原因:Cannot open include file: ‘child.h‘: No such file or directory.文件child.h未找到。

    然后主文件改为:

    #include "child.h"

    voidmain()

    {

    Test();

    }

    程序正常编译,输出结果:Hello World!

    很好的说明了两种引用方式的不同。

    然而,如果这时,再次将主文件引用方式改回:#include ,原来应该报错的程序居然顺利运行了。。。(原因不知道啊,可能是编译器的缺陷,或者编译器自动优化了吧)。针对这一情况,采用VS2015重新重复上述操作过程,不会出现VC++6.0中本应报错的程序通过运行的情况。

    所以,编程时,系统本身存在的头文件最好用<>来引用,用户自定义的头文件必须用""来引用。

    展开全文
  • 我会用STC单片机,最近接个小项目,要...但改建一个C语言工程后,好像找不到头文件,例如网上的这个例子:#in我会用STC单片机,最近接个小项目,要用AVR(ATmega8L)设计程序。刚刚搭建好的开发环境是WinAVR AVR Stud...

    我会用STC单片机,最近接个小项目,要用AVR(ATmega8L)设计程序。刚刚搭建好的开发环境是WinAVR AVR Studio 4,在AVRStudio4里我用汇编写个小程序调试、烧写正常。但改建一个C语言工程后,好像找不到头文件,例如网上的这个例子:

    #in

    我会用STC单片机,最近接个小项目,要用AVR(ATmega8L)设计程序。刚刚搭建好的开发环境是WinAVR AVR Studio 4,在AVRStudio4里我用汇编写个小程序调试、烧写正常。但改建一个C语言工程后,好像找不到头文件,例如网上的这个例子:

    #include //头文件

    #include //引用系统自带的延时函数

    光是这两句话在编译时就会出现如下错误:

    -----------------------------------------------------

    Build started 11.10.2010 at 11:53:45

    avr-gcc.exe -mmcu=atmega8 -Wall -gdwarf-2 -O0 -MD -MP -MT test7.o -MF dep/test7.o.d -c ../test7.c

    ../test7.c:2: error: stray '243' in program

    ../test7.c:2: error: stray '243' in program

    ../test7.c:2: error: expected '=', ',', ';', 'asm' or '__attribute__' before '

    ../test7.c:3: error: stray '243' in program

    ../test7.c:3: error: stray '243' in program

    make: *** [test7.o] Error 1

    Build failed with 5 errors and 0 warnings...

    -----------------------------------------------------

    我是AVR新手,请AVR高人帮我看看这是怎么回事?怎样能解决?

    展开

    全部

    展开全文
  • comm.h和comm.c是公共模块。 test1.h和test1.c使用了公共模块。 test2.h和test2.c使用了了公共模块。 test.h和test.c使⽤用了了test1模块和test2模块。 这样最终程序中就会出现两份comm.h的内容。这样就造成了了文件...
  • 适合C语言新手使用图形库进行编程
  • C语言中两种引用头文件方式的区别

    千次阅读 2020-01-16 22:32:05
    两种引用方式#include<>和#include"" 好久没写过c的程序了,最近要做毕设,写单片机的程序,重新捡起来c。 刚开始写就遇到了麻烦,我自己写了一个.c文件,在另一个文件中要用到这个文件的代码,如果直接复制...
  • 对应配套的一对.c文件和.h文件,若在.c文件中定义变量,那么在.h文件中无法使用;反过来,在.h文件中定义变量,那么在.c文件中是可以使用的
  • 展开全部扩展名为.h的文件,在C语言中被称e69da5e6ba903231313335323631343130323136353331333337393464为header file, 也就是头文件头文件的数据格式就是普通的文本文件,可以通过新建文本文件(txt),再把扩展名...
  • 先去系统目录中找头文件,如果没有再到当前目录下找。所以像标准的头文件 stdio.h和 stdlib.h等用这个方法。 2、""首先在当前目录下寻找,如果找不到,再到系统目录中寻找。 这个用于include自定义的头文件,让系统...
  • C语言自定义头文件

    千次阅读 2021-05-31 17:30:19
    一些初学C语言的人,不知道头文件(*.h文件)原来还可以自己写的。只知道调用系统库函数时,要使用#include语句将某些头文件包含进去。其实,头文件跟.C文件一样,是可以自己写的。头文件是一种文本文件,使用文本...
  • c语言中的头文件互相调用

    千次阅读 多人点赞 2017-12-07 19:30:23
    c语言中的头文件互相调用 今天在阅读...我理解的引用头文件的就是用头文件中的内容代替`#include<head.h>`,但是这样的话应该就会递归调用了啊,这也就是我自己实验时候出现的错误的原因。后来又仔细的看了别人的代码
  • ···),也算是重新认识了一次声明和定义,下面上代码声明和定义:有分配空间的叫定义,没分配空间的叫声明定义:表示创建变量或分配存储单元声明:说明变量的性质,但并不分配存储单元情形一:在源文件(.c)中(函数...
  • c语言引用头文件 “” 和&lt;&gt;的区别 头文件#include &lt;&gt; :表示引用标准库头文件,编译器会从系统配置的库环境中去寻找 头文件#include “”:一般表示用户自己定义使用的头文件,编译器...
  • C语言头文件详解

    千次阅读 2020-06-26 21:43:06
    C语言头文件详解 引言 在C语言家族程序中,头文件被大量使用。一般而言,每个C++/C程序通常由头文件(header files)和定义文件(definition files)组成。头文件作为一种包含功能函数、数据接口声明的载体文件,主要...
  • C语言头文件中定义const变量详解C语言头文件中定义const变量详解在头文件中定义const不会有多变量的警告或错误,如果该头文件被大量包含会造成rom空间的浪费。通过查看*.i文件的展开呢,可以发现每个.i文件都会...
  • C语言如何引用自己写的头文件

    千次阅读 2021-03-14 16:57:12
    一个例子 首先创建一个工作文件夹,在其中创建头文件funtions.h,并写入一下代码: #include<stdio.h> void printstr(char *s);...//以"filename.h" 格式引用头文件,则编译器从当前用户的工作目录开始搜索 i.
  • #include "one.h" #include "two.h" int main(int argc, const char * argv[]) { one(); two(); return 0; } 转载于:https://www.cnblogs.com/liuwj/p/6899507.html...
  • C语言编写头文件

    万次阅读 多人点赞 2019-05-10 23:20:57
    通常我们写C程序时,都会直接使用这样的语句“#include <stdio.h>”。这便是我们通常说的头文件头文件通常用作函数声明,变量声明,常数定义,宏的定义等等。 头文件几个好处: 1,头文件可以定义所用的...
  • c语言 编写头文件

    2019-10-08 16:19:27
    通常我们写C程序时,都会直接使用这样的语句“#include <stdio.h>”。这便是我们通常说的头文件头文件通常用作函数声明,变量声明,常数定义,宏的定义等等。 头文件几个好处: 1,头文件可以定义所用的...
  • C或C++引用头文件的方法

    千次阅读 2018-10-18 21:43:47
    经常会遇到两种include引用头文件的情况,其实区别很简单,如下: 1. 引用头文件的两种方式 #include &lt; &gt; #include &lt; &gt;引用的是编译器类库路径里面的头文件。假如你编译器定义的自带...
  • 一些初学C语言的人,不知道头文件(*.h文件)原来还可以自己写的。只知道调用系统库函数时,要使用#i nclude语句将某些头文件包含进去。其实,头文件跟.C文件一样,是可以自己写的。头文件是一种文本文件,使用文本...
  • 一般情况下,我们都是把函数声明、类定义、模板定义等写到一个头文件里,需要时将相应的头文件用#include包含到源文件(*.cpp文件)里来。但头文件中又允许包含其它的头文件,这样就难免发生某个头文件被重复地包含...
  • c语言头文件头文件中一般放一些重复使用的代码,例如函数声明,变量声明,常数定义,宏的定义等等。当使用#include语句将头文件引用时,相当于将头文件中所有内容,复制到#include处。为了避免因为重复引用而导致...
  • C/C++头文件引用问题(#include使用)

    万次阅读 多人点赞 2018-08-21 17:54:57
    C/C++头文件引用问题(#include使用):   对于一个工程(如下): 在base中包含:func3.h,func3.c,文件夹main和文件夹func4; 在main中包含:main.c,func1.h,func1.c和文件夹func2; 在func2中包含:...
  • C语言头文件中定义全局变量

    千次阅读 2021-05-20 12:57:40
    C语言头文件中定义全局变量头文件定义全局变量等问题全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?可以,在不同的C文件中以static形式来声明同名全局变量。头文件中不可以直接定义变量和函数,...
  • 即.cpp时则运行成功,说是应该建立成源文件的建立成头文件了,即"h1.h",应该建立成"h1.cpp",应该是"c++ Source File",而不是"C/C++ Header File,是怎么回事?为什么? 补充: 如果要编写一个程序,在无头文件的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 155,654
精华内容 62,261
关键字:

c引用头文件