C语言的变量作用域及头文件

最简解决 Unity Error Registry configuration is invalid Unable to connect https packages.unity.cn 前言 在学习其他大佬项目的时候,大佬说项目能直接运行,然后我拉下来就报如下错误 Unity报错:[Package Manager]Error Registry configuration is invalid:Unable to connect “https://packages.unity.cn” 翻了很多博发现是 unity3d 中国增强版的原因,中国增强版屏蔽了国外自定义的插件仓库。 安装 非中国增强版后可以成功打开。 然后大家给出的解决方案都比较激进,大抵就是更换Unity版本就OK了。 当然我是觉 阅读详情


C语言的变量作用域及头文件

  • 关于C语言的变量作用域和头文件的问题都是比较基础的问题,但是这些问题在实际使用过程中的概念不清和混乱会对一个多文件的项目的组织结构及文件结构造成很大的影响,使得项目本身的脉络也变的很模糊。在项目中,多人相互协作完成的项目,这个问题就更加突出。所以也就有了我写(总结)这个文档。

 

一.C语言的变量作用域及相关

1.作用域:

  • 作用域描述了程序中可以访问一个标识符的一个或多个区域。即变量的可见性。一个C变量的作用域可以是代码块作用域、函数原型作用域,和文件作用域。 函数作用域(Function Scope),标识符在整个函数中都有效。只有语句标号属于函数作用域。标号在函数中不需要先声明后使用,在前面用一个goto语句也可以跳转到后面的某个标号,但仅限于同一个函数之中。 文件作用域(File Scope),标识符从它声明的位置开始直到这个程序文件的末尾都有效。例如下例中main函数外面的sum,add,还有main也算,printf其实是在stdio.h中声明的,被包含到这个程序文件中了,所以也算文件作用域的。 块作用域(Block Scope),标识符位于一对{}括号中(函数体或语句块),从它声明的位置开始到右}括号之间有效。例如上例中main函数里的num。此外,函数定义中的形参也算块作用域的,从声明的位置开始到函数末尾之间有效。 函数原型作用域(Function Prototype Scope),标识符出现在函数原型中,这个函数原型只是一个声明而不是定义(没有函数体),那么标识符从声明的位置开始到在这个原型末尾之间有效。例如void add(int num);中的num。

下面再介绍另一种分类形式:它分为代码块作用域和文件作用域。代码块作用域和文件作用域也有另一种分类方法,局部作用域和全局作用域。

  • 代码块作用域:代码块是指一对花括号之间的代码,函数的形参虽然是在花括号前定义但也属于代码作用域。在C99中把代码块的概念扩大到包括由for循环、while循环、do while循环、if语句所控制的代码。在代码块作用域中,从该变量被定义到代码块末尾该变量都可见。 文件作用域:一个在所有函数之外定义的变量具有文件作用域。具有文件作用域的变量从它的定义处到包含该定义的文件结尾都是可见的。

2.链接

  • 一个C语言变量具有下列链接之一:外部链接(external linkage),内部链接(internal linkage)或空链接(no linkage)。 空链接:具有代码块作用域或者函数原型作用域的变量就具有空链接,这意味着他们是由其定义所在的代码块或函数原型所私有。 内部链接:具有文件作用域的变量可能有内部或外部链接,一个具有文件作用域的变量前使用了static标识符标识时,即为具有内部链接的变量。一个具有内部链接的变量可以在一个文件的任何地方使用。 外部链接:一个具有文件作用域的变量默认是具有外部链接的。但当起前面用static标识后即转变为内部链接。一个具有外部链接的链接的变量可以在一个多文件程序的任何地方使用。

例: static int a;(在所有函数外定义)内部链接变量 int b; (在所有函数外定义) 外部链接变量 main() {

  • int b;//空链接,仅为main函数私有。
  • ..

} 3.存储时期

  • 一个C语言变量有以下两种存储时期之一:(未包括动态内存分配malloc和free等) 静态存储时期(static storage duration)和自动存储时期(automatic storage duration)和动态存储时期。 静态存储时期:如果一个变量具有静态存储时期,他在程序执行期间将一直存在。具有文件作用域的变量具有静态存储时期。这里注意一点:对于具有文件作用域的变量,关键词static表明链接类型,而不是存储时期。一个使用了static声明了的文件作用域的变量具有内部链接,而所有的文件作用域变量,无论他具有内部链接,是具有外部链接,都具有静态存储时期。
  • 自动存储时期:具有代码块作用域的变量一般情况下具有自动存储时期。在程序进入定义这些变量的代码块时,将为这些变量分配内存,当退出这个代码块时,分配的内存将被释放。

举例如下:

 

//example_1.c
 
[html]  view plain copy
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3.   
  4. void add(int num);//文件作用域,外部链接,  
  5. void chang_sum();//文件作用域,外部链接  
  6. int sum=1; //文件作用域 外部链接,静态存储时期  
  7. int main(int argc, char *argv[])  
  8. {  
  9.         int num = 5;//函数作用域,空链接  
  10.         add(num);  
  11.         printf("main num=%d/n",num); /*输出5*/  
  12. //内层定义覆盖原则,当内层代码块定义了一个与外层代码块相同时名字的变量时,  
  13. //运行到内层代码块时,使用内层定义的变量,离开内层代码块时,外层变量恢复  
  14. //此时sum为for中定义的sum,而不是全局的sum  
  15.         for(int sum=0, num=0;num<5;num++)//代码块作用域,空链接,自动存储时期  
  16.         {  
  17.                 sum+=num;  
  18.                 printf("====================/n");  
  19.                 printf("for num=%d/n",num);//输出0-5  
  20.                 printf("for sum=%d/n",sum);//输出0-5的叠加和  
  21.         }  
  22.         printf("====================/n");  
  23.         {  
  24.                 int i;//代码作用域。仅在该大括号内可见。空链接,自动存储时期  
  25.                 for(i=0;i<10;i++);  
  26.                 printf("i=%d/n",i);  
  27.         }  
  28. //      printf("i=%d/n",i);//编译通不过  
  29.         printf("main sum=%d/n",sum);//输出0。  
  30.         printf("main num=%d/n",num);// 输出5  
  31.         chang_sum();  
  32.         printf("file sum=%d/n",sum);//输出1。全局的sum。内层定义覆盖原则。  
  33.         system("PAUSE");  
  34.   
  35.         return 0;  
  36. }  
  37.   
  38. void add(int num)//代码作用域  
  39. {  
  40.         num++;  
  41.         printf("add num= %d/n",num); /*输出6*/  
  42. }  
  43. void chang_sum()  
  44. {  
  45.         sum++;  
  46.         printf("chang_sum = %d/n",sum); /*输出1*/  
  47. }  

 

以上示例须在在C99标准下编译。(gcc支持c99的方法,编译时加入参数 –std=C99)。从上例中可以比较清楚明白代码作用域和文件作用域的概念。另外注意文件作用域不仅限于变量也包括函数。在文件作用域中函数也是以其声明开始到文件结尾结束。而且当拥有文件作用域与拥有代码作用域变量同名时,不会发生冲突,而是以最小作用域的变量可见。

4.存储类修饰符(Storage Class Specifier)有以下几种关键字,可以修饰变量或函数声明:

  • static,用它修饰的变量的存储空间是静态分配的,用它修饰的文件作用域的变量或函数具有Internal Linkage(内部链接)。 auto,用它修饰的变量在函数调用时自动在栈上分配存储空间,函数返回时自动释放,例如上例中main函数里的num其实就是用auto修饰的,只不过auto可以省略不写(此处与编译器有关,参照编译器不同而有所变动),auto不能修饰文件作用域的变量。
  • register,编译器对于用register修饰的变量会尽可能分配一个专门的寄存器来存储,但如果实在分配不开寄存器,编译器就把它当auto变量处理了,register不能修饰文件作用域的变量。现在一般编译器的优化都做得很好了,它自己会想办法有效地利用CPU的寄存器,所以现在register关键字也用得比较少了。 extern,上面讲过,链接属性是根据一个标识符多次声明时是不是代表同一个变量或函数来分类的,extern关键字就用于多次声明同一个标识符。

c语言使用作用域,链接和存储时期来定义了5种存储类:自动,寄存器,具有代码块的作用域的静态、具有外部链接的静态,以及具有内部链接的静态。

  • 五种存储类

存储类

时期

作用域

链接

声明方式

自动

自动

代码块

空

代码块内

寄存器

自动

代码块

空

代码块内,使用register

具有外部链接的静态

静态

文件之间

外部

所有函数之外

具有内部链接的静态

静态

文件之内

内部

所有函数之外使用关键字static

空链接的静态

静态

代码块

空

代码块内,使用关键字static

  • 二.头文件的处理和书写 很多人对C语言中的 “文件包含”都不陌生了,文件包含处理在程序开发中会给我们的模块化程序设计带来很大的好处,通过文件包含的方法把程序中的各个功能模块联系起来是模块化程序设计中的一种非常有利的手段。 头文件的功能:
    • (1)通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。
    • (2)头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。
    文件包含处理是指在一个源文件中,通过文件包含命令将另一个源文件的内容全部包含在此文件中。在源文件编译时,连同被包含进来的文件一同编译,生成目标目标文件。怎么写文件件? 怎么包含才能避免重定义? 其实这个只要了解了文件包含的基本处理方法就可以对文件包含有一个很好的理解与应用了: 文件包含的处理方法:
  • (1) 处理时间:文件包含也是以"#"开头来写的(#include ), 那么它就是写给预处理器来看了, 也就是说文件包含是会在编译预处理阶段进行处理的。
  • (2) 处理方法:在预处理阶段,系统自动对#include命令进行处理,具体做法是:降包含文件的内容复制到包含语句(#include )处,得到新的文件,然后再对这个新的文件进行编译。
    • 抓住这两点,那么这个就没有什么难的了。。。
      • 首先,先对#include指令的作用和实际验证一下。 #include指令是预处理指令,它仅仅是将#incluce "A.h"中的A.h的内容替换它自己所在位置,和C语言中的宏的使用类似。而且A.h并不是说必须是.h的文件,只要是文本文件都可以的。下面我给出两个例子证明一下。

例1:有以下两个文件,main.c和main.n

 

 
[cpp]  view plain copy
  1. //file1 main.c  
  2. #include<stdio.h>  
  3. #include<stdlib.h>  
  4.   
  5. #include "main.n"//包含了main.n的文本文件。  
  6. int main()  
  7. {  
  8.       n = 2;  
  9.       printf("n=%d/n",n);  
  10.         return 1;  
  11.       }  
  12.    
  13. //file2 main.n  
  14.   
  15.   
  16. int n;  

 
  • 这时我们对main.c进行编译 gcc main.c -o main.exe(我在windows系统下),你会发现能编译通过并打印出n的值。如果你使用预编译参数-E,会在预编译后的文件中发现其原因所在。使用 gcc -E main.c -o main.cpp。打开main.cpp后在文件最后会有如下内容。

 

 
  1. # 3 "main.c" 2  
  2.   
  3. # 1 "main.n" 1  
  4. int n;  
  5. # 5 "main.c" 2  
  6. int main()  
  7. {  
  8.   
  9.       printf("n=%d/n",n);  
  10.       system("pause");  
  11.  return 1;  
  12. }  

以上的示例应该能比较明显解释#include的作用,和使用方法了。但是在实际开发中,这种使用方式是严重的不规范行为,强烈建议不要使用。同样下边的例子也是一样的建议。

例2:

  • (1)包含.c文件:
  •    
    1. //file1:  main.c  
    2.  #include <stdio.h>  
    3.  #include <stdlib.h>  
    4.  #include "test.c"  
    5.  int main(int argc, char *argv[])  
    6.  {  
    7.  m=5;  
    8.  for(int i=0;i<5;i++)  
    9.  {  
    10.  add();  
    11.  m++;  
    12.  test();  
    13.  }  
    14.  system("PAUSE");  
    15.  return 0;  
    16.  }  
    17.  12: //end of file1  
    18.  //file2:test.c  
    19.  static int n;  
    20.  int m;  
    21.  int add();  
    22.  void test()  
    23.  {  
    24.  int t_sum;  
    25.  printf("m = %d/n",m);  
    26.  printf("n = %d/n",n++);  
    27.  t_sum = add();  
    28.  printf("add = %d/n",t_sum);  
    29.  }  
    30.  int add()  
    31.  {  
    32.  static int sum;  
    33.  sum++;  
    34.  return sum;  
    35.  }  
    36.  //end of file2  
  • 这个例子是采用 包含.c文件 的方法实现的。 在编译时,直接去编译main.c文件,预处理器会先把test.c文件中的内容复制到main.c中来,然后再对新的main.c进行编译。
  • 编译命令:
    • gcc main.c -o main
    • 可以看到,这里并没有对test.c进行编译,但还是生成了最终的main可执行程序。 也可以通过命令来观察一下预处理的结果: 编译命令:
      • gcc -E main.c -o main.cpp(仅预处理)
    在main.cpp文件末尾可以看来下面一段代码:
    •      
      1. # 3 "main.c" 2  
      2. # 1 "test.c" 1  
      3.   
      4.   
      5. static int n;//此处是test.c的内容  
      6. int m;  
      7. int add();  
      8. void test()  
      9. {  
      10.      int t_sum;  
      11.      printf("m = %d/n",m);  
      12.      printf("n = %d/n",n++);  
      13.      t_sum = add();  
      14.      printf("add = %d/n",t_sum);  
      15.      }  
      16. int add()  
      17. {  
      18.     static int sum;  
      19.     sum++;  
      20.     return sum;  
      21.     }  
      22. # 4 "main.c" 2//此处是main.c的内容  
      23. int main(int argc, char *argv[])  
      24. {  
      25.   m=5;  
      26.   for(int i=0;i<5;i++)  
      27.   {  
      28.             add();  
      29.   m++;  
      30.   test();  
      31.   }  
      可见,其实就是将test.c文件中的内容添加到了main函数之前,然后对新的文件进行编译,生成最终的可执行程序。

这次如果还是按照上面的方法只编译main.c的话就会出错,因为变量m和函数add并没有在main.c中定义,所以编译时需要将test.c一起编译:

编译命令:

gcc -c main.c -o main.o #编译main.c

gcc -c fun.c -o fun.o #编译fun.c

gcc main.o fun.o -o main #用main.o fun.o生成main

到这里大家应该已经理解包含#include文件和多文件程序的本质区别了。

包含文件仅仅是在c预编译时进行再次整合,最终的还是合并成一个文件编译,生成执行文件。

而多文件的编译,是多个文件分别编译,(也可能是在编译时添加必须的标识),然后通过链接器将各个文件链接后加载形成可执行文件。

  • 这种方式会使得我们的定义和声明分开,不容易产生重定义。而且也利于模块化,仅通过头文件来给出接口,而隐藏具体的实现。

预处理时会把头文件中的内容复制到包含它的文件中去,而复制的这些内容只是声名,不是定义,所以它被复制再多份也不会出现"重定义"的错误。。。

  • 前面说了头文件的方法也是模块化程序设计中的一种非常有利的手段。把同一类功能写到一个.c文件中,这样可以把他们划为一个模块,另外再对应的写上一

个.h文件做它的声明。这样以后再使用这个模块时只需要把这两个文件添加进工程,同时在要使用模块内函数或变量的文件中包含.h文件就可以了。

举个很实际的例子,在单片机、ARM或其他嵌入式开发中,每一个平台可能本身都有多种不同的硬件模块,使用时需要去写相应的驱动程序,

这样就可以把各个硬 件模块的驱动程序作为一个模块(比如lcd驱动对对应lcd.c和lcd.h,IIC驱动对应I2C.c和I2C.h等),当具体使用到某个模块时,

只需 要在将对应的.c和.h文件添加进工程,并在文件中包含对就的.h文件即可。

根据以上的原理理解和实际中使用的一些问题及模块化的原则,对头文件写法给出以下几点个人建议作为基础:

 

(1) 按相同功能或相关性组织.c和.h文件,同一文件内的聚合度要高,不同文件中的耦合度要低。接口通过.h文件给出。

(2) 对应的.c文件中写变量、函数的定义,并指定链接范围。对于变量和函数的定义时,仅本文件使用的变量和函数,要用static限定为内部链接防止外部调用。

(3) 对应的.h文件中写变量、函数的声明。仅声明外部需要的函数,和必须给出变量。有时可以通过使用设定和修改变量函数声明,来减少变量外部声明。

(4) 如果有数据类型的声明 和 宏定义 ,请写的头文件(.h)中,这时也要注意模块化问题,如果数据类型仅本文件使用则不必在写头文件中,而写在源文件(.c)中,会提高聚合度。减少不必要的格式外漏。

(5) 头文件中一定加上#ifndef...#define....#endif之类的防止重包含的语句

(6) 头文件中不要包含其他的头文件,头文件的互相包含使的程序组织结构和文件组织变得混乱,同时给会造成潜在的错误,同时给错误查找造成麻烦。如果出现,头文件中类型定义需要其他头文件时,将其提出来,单独形成全局的一个源文件和头文件。

(7)模块的.c文件中别忘包含自己的.h文件

以上几点仅是个人观点,供大家讨论,如果有意见或是认为不合理或是有更合理的方式请讨论指出。

补充1:

  • 按照c语言的规则,变量和函数必须是先声明再使用。可以多次声明,但不可以多次定义。

补充2:变量的定义和声明。

  • “声明”仅仅是告诉编译器某个标识符是:变量(什么类型)还是函数(参数和返回值是什么)。要是在后面的代码中出现该标识符,编译器就知道如何处理。记住最重要的一点:声明变量不会导致编译器为这个变量分配存储空间。 C语言专门有一个关键字(keyword)用于声明变量或函数:extern。带有extern的语句出现时,编译器将只是认为你要告诉它某个标识符是什么,除此之外什么也不会做(直接变量初始化除外)。

编译器在什么情况下将语句认为是定义,什么情况下认为是声明。这里给出若干原则: #1 带有初始化的语句是定义 例如:

  • int a = 1; //定义

#2 带有extern的语句是声明(除非对变量进行初始化) 例如:

  • extern int a; //声明 extern int b = 2; //定义

#3既没有初始化又没有extern的语句是“暂时定义”(tentative definition) C语言中,外部变量只能被(正式)定义一次:

  • int a = 0; int a = 0; //错误!重复定义

又或者:

  • int a = 0; double a = 0.1; //错误!标识符a已经被使用

暂时定义有点特殊,因为它是暂时的,我们不妨这样看: 暂时定义可以出现无数次,如果在链接时系统全局空间没有相同名字的变量定义,则暂时定义“自动升级”为(正式的)定义,这时系统会为暂时定义的变量分配存储空间,此后,这些相同的暂时定义(加起来)仍然只算作是一个(正式)定义。 例如: /*Example C code*/ int a; //暂时定义 int a; //暂时定义 int main(void) {

  • a = 1; return 0;

} int a; //暂时定义

“EXB文件的格式和编程“ 首先,打开文件并读取文件头,然后解析文件头中的元数据信息。接下来,循环读取数据块,每次读取块头部分,解析块的大小和类型,并读取相应大小的块数据。文件头(Header):EXB文件通常包含一个文件头,用于存储关于文件的元数据信息。读取EXB文件时,首先需要解析文件头,以了解文件的属性和数据结构。总结起来,EXB文件是一种常见的二进制数据文件格式,在编程中处理EXB文件需要了解其基本结构和元数据信息。通过以上代码,您可以根据自己的需求扩展处理其他类型的数据块,或者根据EXB文件的具体规范进行解析和处理。 阅读详情

相关推荐

从AI画稿到3D虚拟时装:Illustrator与Substance 3D的服装设计工作流

本文旨在解决传统服装与纺织品设计师在产品开发流程中,面临的“2D印花图案无法直观预见3D上身效果”、“物理打样成本高昂且周期漫长”的核心痛点。我们将介绍一套纯数字化的3D可视化工作流,核心是利用 Adobe Illustrator 进行矢量印花图案创作,通过 Adobe Substance 3D Sampler 将其转化为逼真的PBR(基于物理渲染)布料材质,并最终在 Adobe Substance 3D Stager 中,将该材质应用于3D服装模型,渲染出照片级的虚拟样衣。本指南将帮助设计师以极低的成本和

Kingsdesigner的博客 1395

关于C头文件吗中定义或声明变量的问题

1.谨记一点,#include&lt;myhead.h&gt; 只是头文件内容在此处的文本展开 2.c语言文件全局区的变量是若非static声明,实在其他同目录下的文件内可见的。 所以得出以下结论: 假设头文件中有:int a; 1.头文件中声明且定义的话 此时若有两个文件同时包含了头文件,则会在两个文件中都定义了a,所以重定义,可在头文件中int a 前加static避免; 2.头文...

yangbomoto的博客 2422

10-142 6-4 查询厂商“D“生产的PC和便携式电脑的平均价格

分数 10全屏浏览题目切换布局作者 lhm单位 河北农业大学本题目要求编写SQL语句,查询厂商D生产的PC和便携式电脑的平均价格。

dqd66的博客 2748

【C++】(九)作用域、生命期、头文件和工程文件

作用域和生命期 1 局部变量和全局变量 1.1 局部变量 在函数内部或复合语句中(简称区域)定义的变量,称为局部变量 (local variable),又称为内部变量。 下列变量是局部变量 在一个函数内部定义的变量 函数的形式参数 在某个复合语句中定义的变量 局部变量的说明: (1)局部变量只能在定义它的区域及其子区域中使用。 (2)在同一个区域中不能定义相同名字的变量。 (3)在不同区域中允许定义相同名字的变量,但本质上它们是不同的变量 (4)如果一个变量所处区域的子区域中有同名的变量,则该变量 在

weixin_44378835的博客 1570

(实战)[re:Invent 2018]-001:赛道分析-(致敬1024)

打印log

Rainbow 2778

FPGA学习之路—应用程序—原码二位乘法器及Verilog代码分析

FPGA学习之路——原码二位乘法器及Verilog代码分析 原理 原码乘法可以分为原码一位乘和原码二位乘,两者在实现规则上大同小异。原码一位乘每次判断乘数的最低位,对被乘数和部分积进行相应操作。而原码二位乘则是对乘数的低二位进行判断,并执行相关操作。 两位乘数的取值可以有四种可能组合,每种组合对应于以下操作: 00相当于0x,部分积Dresult右移2位,不进行其他运算; 01相当于1x,部分积D...

谦豫 3716

C语言序列3——全局变量和局部变量,标识符作用域、变量的生存期

#include <stdio.h> const int A = 10; int a = 20; static int b = 30; int c; int main(void) { static int a = 40; char b[] = "Hello world"; register int c = 50; printf("Hello world %d\n", c); return 0; } 作用域(Scope)这个概念适用于所有标识符,而不仅仅是变量,C语言的作用域.

ilgfcyll的博客 1301

2024年全国大学生电子设计竞赛H题_自动行驶小车

自动行驶小车(H题)【本科组/高职高专组】

qq_74395263的博客 1万+

14-C语言多文件编程

前面编译过程中已经提到了,宏在预处理阶段会被替换成宏所对应的常量数据,而在编译阶段才会进行语法检查;如果代码中宏的使用发生了错误,是没法定位到错误语句的;同时,也可以通过宏来定义数组。代码演示10int main()return 0;运行结果40之前我们在定义数组的时候,[]里只能传整数常量,这里通过宏也可以定义成功,因为宏的预处理阶段就替换成了对应的整数常量了,编译阶段进行语法检查不会有问题。定义宏的时候,不要在末尾加分号;。同时还可以通过另外一种方法,在linux。

qq_63958145的博客 1317

【部署】Docker部署OpenClaw及常见问题解决(win11)

给AI单独开一个隔离的小容器,AI执行所有命令、下载文件都在这个小盒子里,就算AI被诱导执行危险命令,也不会影响你Win11本机的文件和系统,是必开的安全功能。Docker容器里的OAuth回调,会尝试在你Win11本机的1455端口捕获认证信息,但容器和Win11本机的网络隔离,导致浏览器访问不到这个回调地址。「挂载」就是把你Win11本机的文件夹,共享给容器里的「虚拟小电脑」,两边都能读写文件,比如你想让AI操作你D盘里的代码文件,就需要挂载。

海兰 4696

2024年12月数据月报

2024年12月大数据月报,为您准备了阿里、字节、百度等大厂150多篇实践案例

SmartSi 2654

c语言语句标号 作用域,c语言的变量作用域及头文件.pdf

c语言的变量作用域及头文件C语言的变量作用域及头文件关于C语言的变量作用域和头文件的问题都是比较基础的问题,但是这些问题在实际使用过程中的概念不清和混乱会对一个多文件的项目的组织结构及文件结构造成很大的影响,使得项目本身的脉络也变的很模糊。在项目中,多人相互协作完成的项目,这个问题就更加突出。所以也就有了我写 (总结)这个文档。一.C语言的变量作用域及相关1.作用域:作用域描述了程序中可以访问一个...

weixin_35870469的博客 867

79、昇腾系列服务器/昇腾系列推理卡/昇腾系列嵌入式开发板+Dify+one api部署DeepSeek-R1-Distill-Qwen-32BW8A8+RAG本地模型知识库和负载均衡双实例

阶段,安装过程缺什么,,在docker外面git下源码,进入容器内部进行量化,这里的容器建议在创建个8卡的容器,双卡容器量化会显示npu显存不够,除非你用cpu转模型,我就懒得创建容器了,使用cpu量化吧,巨慢;创建容器,进入容器,计划使用两张昇腾NPU卡推理DeepSeek-R1-Distill-Qwen-32B的W8A8模型,所以构建的容器用两张卡,选6、7卡吧,0-6号卡可以跑文本嵌入模型、重排序模型;直接进入量化阶段,在容器外面操作即可,环境不用管,因为系统已经默认配置了环境,直接跳到。

sxj731533730 6118

C程序设计语言- 函数与程序结构-3.1----函数的基本知识、外部变量、作用域规则、头文件

前言:C系列第三章--函数与程序结构 1.函数的基本知识 函数的定义形式如下: 返回值类型  函数名(参数声明表) {                 声明和语句 } 尽管我们可以把所有的代码都放在主程序main中,但是更好的做法是,利用其结构把每一部分设计成一个独立的函数。下面我们贴出 代码: #include #define MAXLINE 1000

wu371894545的博客 756

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【C语言从不挂科到高绩点】16-作用域和自定义头文件

include 叫做文件包含指令,用来引入对应的头文件(.h 文件)#include 是 C 语言中预处理命令的一种,处理过程很简单,就是将头文件中的内容插入到该命令所在的位置。从而将头文件和当前源文件链接成一个源文件(实际上就是复制粘贴)#include 的两种用法使用尖括号, 编译器会到系统路径下查找头文件使用 双引号“”,编译器首先会在当前项目目录查找头文件,如果没有找到再到系统路径下查找。引入 C 语言标准库中的头文件使用,引用自定义头文件使用双引号“”。

yueyehuguang的博客 1460

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

c语言文件中的函数默认作用域,c语言中头文件的-函数-全局变量-extern

头文件中一般放一些重复使用的代码,例如函数声明,变量声明,常数定义,宏的定义等等。当使用#include语句将头文件引用时,相当于将头文件中所有内容,复制到#include处。为了避免因为重复引用而导致的编译错误,头文件常具有#ifndefLABEL#defineLABEL//代码部分#endif的格式。其中,LABEL为一个唯一的标号,命名规则跟变量的命名规则一样。常根据它所在的头文件名...

weixin_35219482的博客 556

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C语言K&R圣经笔记 4.4作用域规则 4.5头文件 4.6静态变量

和。

十八年后又是一条好汉的博客 1168

1、C语言外部说明(变量及函数的作用域扩充)

C语言外部说明(变量及函数的作用域扩充) C习惯编程方式:在.c文件中定义,同名.h文件中声明,需要使用时.c中的程序时,#include 同名.h文件就可以。 注:(同名中只是为了程序逻辑清晰,不同名的.c和.h文件也是一样的。) C编译方式:只同时编译.c文件,不会编译.h文件,所以如果需要.h文件的编译,只能包含在.c文件当中去。 C外部变量的查找方式:在本项目或工程中的所有文件...

weixin_33872566的博客 292

零基础学C语言——作用域

本文详细介绍了C语言的作用域概念。

weixin_40960130的博客 1116

1.C语言0基础自学-从第一行代码开始

从第一行代码解读C语言代码,c语言0基础入门,大一初学c语言

qq_59959075的博客 5263

c语言头文件怎么写?

c语言头文件怎么写? 大致格式: #ifndef __ABC_H__ #define __ABC_H__ //以上是为了防止头文件被多次包含,可以省略,最好有,名字任意,保证唯一即可 //以下是宏定义,可有可无 #define MAX 100 #define MIN 0 //以下是结构声明,可有可无 type

badman250的专栏 5万+

c语言中头文件的建立与使用-函数、全局变量、全局数组

<br />一些初学C语言的人,不知道头文件(*.h文件)原来还可以自己写的。只知道调用系统库函数时,要使用#i nclude语句将某些头文件包含进去。其实,头文件跟.C文件一样,是可以自己写的。头文件是一种文本文件,使用文本编辑器将代码编写好之后,以扩展名.h保存就行了。头文件中一般放一些重复使用的代码,例如函数声明,变量声明,常数定义,宏的定义等等。当使用#i nclude语句将头文件引用时,相当于将头文件中所有内容,复制到#i nclude处。为了避免因为重复引用而导致的编译错误,头文件常具有<br

打不死的心态活到老 1万+

嵌入式学习一阶段——C语言:C程序组成

"对象"就是一个东西 , "名字"

liu1526246800的博客 122

函数---(定义,头文件,函数的调用机制, 函数的注意事项和细节讨论, 函数传递的两种方式)(变量的作用域)(static关键字)

函数的定义 基本语法: 调用函数和引用变量一样,都需要 “先定义后使用”, 定义函数是对函数功能的确立,其一般格式为: 返回值类型 函数名 (形参) { 声明部分; 语句部分; } 1)形参列表:表示函数的输入; 2) 函数中的语句:表示为了实现某一功能代码块; 3) 函数可以有返回值,也可以没有, 如果没有返回值,返回类型 声明为 void 。 代码演示: //定义一个实现两数求和功能的函数 int sum(int x,int y){ int z; z=x+y; return z; } 头文件 基

RSH的博客 1200

C语言编程之头文件

在C语言的编程中,我们经常会出现比如比较大小的函数,等到下次在想使用这个函数时,就不需要再次的编写这个函数,可以直接引用这个函数,这就需要我们引用这个函数的头文件,就可以了。 引用头文件:#include&lt;&gt;只有会去系统目录下查找                    #include""会去指定路径下查找,如果查找不到,则会去系统下 在写函数的时候,我们经常会用到extern  ...

weixin_40989362的博客 1481

c语言全局变量和局部变量

c语言全局变量和局部变量1、局部变量能否和全局变量重名?答:能,局部会屏蔽全局。要用全局变量,需要使用::      (注:在Linux中用gcc编译可能会出错,需要用g++编译)局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义

Cynric 的博客 2094
上一篇: C++中的头文件和源文件
下一篇: 关于函数strtok和strtok_r的使用要点和实现原理(一)
Savitch
博客等级 码龄16年 84粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值