首页 > 其他分享 >extern、const、register、static、inline关键字 --20240225

extern、const、register、static、inline关键字 --20240225

时间:2024-02-25 23:23:14浏览次数:21  
标签:const 函数 -- register 关键字 编译器 static extern

extern关键字 extern关键字有两种用法: 1、用于声明一个全局变量或函数的外部链接性 2、extern "C" 是一个语言特性,用于告诉编译器按照 C 语言的方式对待指定的代码块,以确保与 C 语言兼容   用法一:用于声明一个全局变量或函数的外部链接性

// file1.c
#include <stdio.h>

int numbers[5]; // 数组的定义

void set_numbers() {
    for (int i = 0; i < 5; i++) {
        numbers[i] = i * 2;
    }
}

// file2.c
#include <stdio.h>

extern int numbers[5]; // 使用 extern 关键字声明数组

void print_numbers() {
    for (int i = 0; i < 5; i++) {
        printf("%d ", numbers[i]);
    }
    printf("\n");
}

// main.c
#include <stdio.h>

extern void set_numbers(); // 声明函数
extern void print_numbers(); // 声明函数

int main() {
    set_numbers(); // 调用定义在 file1.c 中的函数设置数组的值
    print_numbers(); // 调用定义在 file2.c 中的函数打印数组的值

    return 0;
}
运行结果: 0   用法二:extern "C"
// library.h
#ifdef __cplusplus
extern "C" {
#endif

void c_function();

#ifdef __cplusplus
}
#endif

// library.c
#include <stdio.h>

void c_function() {
    printf("This is a C function\n");
}

// main.cpp
#include "library.h"

int main() {
    c_function(); // 调用 C 语言编写的函数
    return 0;
}
在 C++ 中,为了支持函数的重载(overloading)和其他特性,编译器会将函数名和参数信息组合起来,生成一个经过特定规则处理的函数名。这个生成的函数名会包含函数的原始名称、参数类型等信息,以确保在同一个作用域内唯一标识一个函数。而C语言则不会,因此会造成链接时找不到对应函数的情况,此时C函数就需要用extern “C”进行链接指定,这告诉编译器,请保持我的名称,不要给我生成用于链接的中间函数名。 demo代码如何编译使用可见: https://www.cnblogs.com/lethe1203/p/18033327   const关键字 在 C 语言中,const 关键字可以用于以下几个场景: 1、修饰变量:通过将变量声明为 const 类型,可以将其定义为只读的常量。这意味着一旦变量被初始化,就不能再对其进行修改。例如:
const int num = 10;
2、修饰函数参数:在函数定义中,可以将某个函数参数声明为 const 类型,表示在函数内部不会修改该参数的值。这可以用于提高代码的可读性和安全性。例如:
void print(const char* str);
3、修饰函数返回值:在函数声明或定义中,可以将函数返回值声明为 const 类型,表示返回的值是只读的,不能被修改。例如:
const int getValue();
4、修饰指针:在 C/C++ 中,可以使用 const 关键字来修饰指针类型,分别表示指针本身为常量或指向常量的指针。例如:
int* const ptr; // 常量指针,指针本身为常量 
const int* ptr; // 指向常量的指针,指针指向的内容为常量 
const int* const ptr; // 常量指针,指向常量的指针
  register关键字 register 关键字是 C 语言中的一个关键字,用于向编译器建议将变量存储在寄存器中,以提高访问速度。 然而,现代编译器已经非常智能,在优化代码时会根据需要自动选择最佳的存储方式,包括寄存器、缓存或内存等。因此,使用 register 关键字并不能保证变量一定会存储在寄存器中。 因此,无论是否使用 register 关键字,编译器都会根据具体情况进行优化,开发者不需要手动指定变量存储在寄存器中。实际上,现代编译器往往比开发者更了解如何优化代码,因此现在不再建议使用 register 关键字   static关键字 static 关键字在 C 语言中有多种用途,主要取决于它所修饰的上下文。下面我将介绍 static 在不同情况下的用法: 1、在全局变量和函数中
  • 在全局变量前使用 static 关键字可以限定该变量的作用域为当前文件,在其他文件中无法访问。
  • 在函数前使用 static 关键字可以将函数的作用域限定为当前文件,使其对其他文件不可见。
2、在局部变量中
  • 在局部变量前使用 static 关键字可以改变该变量的存储位置,使其在整个程序执行期间保持存在,而不是在函数执行结束后销毁。
  • 静态局部变量只会被初始化一次,在函数调用结束后仍然保留其值,下次调用时仍然有效。
  • 在函数内部定义的静态变量(局部静态变量)会在程序运行过程中一直存在,不会像普通局部变量一样在函数执行完毕后销毁。
  • 静态局部变量的作用域仅限于包含它的函数内部,但其生存周期超出了函数的调用周期。
  static关键字在内核驱动中很常见,举一个常见用法: 在内核驱动中,static 关键字可以用于实现驱动隔离的效果。通过使用 static 关键字将函数和变量的作用域限定在当前文件中,从而隐藏其对其他文件的可见性。这样可以有效地将不同模块之间的功能隔离开来,减少命名冲突和代码耦合。   inline关键字 inline 关键字用于提示编译器将函数内联展开,以提高程序的执行效率。使用 inline 关键字可以减少函数调用的开销,特别是对于简单的、频繁调用的函数而言。 inline关键字与宏定义区别: 宏定义是在编译器在对源码的预处理阶段,无脑进行宏符号替换,替换时不做语法检查,比如"入参"类型是否匹配,"入参"个数是否匹配等。 inline关键字则会告诉编译器,此函数是内联函数,希望编译器尽可能的在编译阶段将此函数展开到调用此函数的地方,且对此内联函数按照常规函数一样进行语法检查,比如入参类型,入参个数等。

标签:const,函数,--,register,关键字,编译器,static,extern
From: https://www.cnblogs.com/lethe1203/p/18033335

相关文章

  • 23 design patterns
    ///-----------------23个设计模式是7个原则的具体形式,7原则是23个模式的凝练------------------//////-----------------target:高内聚、低耦合------------------///1.软件设计模式结构类比就是结构class或者是结构体行为类比class里面的函数创造的话,是构造出结构,让......
  • filter拦截与放行
    @WebFilter(urlPatterns="/*")publicclassLoginChechedFilterimplementsFilter{//拦截方法,只要资源链接被拦截就会触发此方法@OverridepublicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainfilterChain)throwsIO......
  • 完整登录功能实现
    1、导入pom.xml依赖<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency></dependencies>2、生成和解析令牌类的书写privatestatic......
  • ssts-hospital-web-master项目实战记录十四:项目迁移-模块实现(log-local)
    记录时间:2024-02-25一、log-local模块实现framework/config/index.ts//终端日志文件配置constLogTerminalInfoDir='D:\\LogInfo\\LogTerminalInfo\\'constLogTerminalInfoFileNamePrefix='LogTerminalInfo'//错误页面快照文件配置constLogErrorPageSnapshotFil......
  • 【Python】conda基本使用、pip换源、pip超时问题解决
    conda问题往期笔记conda安装:https://www.cnblogs.com/mllt/p/Anaconda-install.htmlconda基础操作https://www.cnblogs.com/mllt/p/jqsj_base_000.html创建环境命令行创建环境的方式见上文“conda基础操作”后面的链接文章。在此演示的是使用pycharm创建conda虚拟环境......
  • 学习记录
    三、进行部署1.安装Nginx软件商店-搜索Nginx-进行安装2.Nginx配置软件商店-已安装-Nginx-设置-配置修改62行的listen888;为监听888端口65行root/www/server/phpmyadmin;表示在此路径下去寻找将62行的listen888改为80将64行的index.html改为combine.html,因为一会儿要上传的网页......
  • 类的集成和类成员的访问控制
    1.被sealed修饰的类代表不能做为基类: 2.一个类最多只能有一个基类3.子类的访问级别不能超过父类的访问级别,可和父类的访问级别持平; 4.继承 5.当父类中的构造器有参数时,子类的构造器的写法6.由以上4、5点说明构造器是不能被子类所继承的:7.访问级别是受最上层级别......
  • SHOI游记
    写在前面我现在只是一个实力平庸的初二选手,侥幸在NOIP中获得了279分,勉强有机会参加省选。我深知进队本就困难,更何况初中生人数的限制。初中有不少实力在我之上的选手,所以我明白,进队的希望是极其渺茫的。当我明白这点,我便将这次的目标从进队,放到了在这次考前的集训中摄取更多的知......
  • 智能AI客服系统+企业专属AI知识库实现原理+配置教程
    企业专属AI知识库实现原理知识库是GPT用户咨询问题,调用文本转向量接口将问题转为向量数据,向量化搜索知识数据库,将相关知识文本整合后发送给GPT聊天补全接口 知识库服务主要基于以下两个接口:OpenAI聊天接口(/v1/chat/completions)OpenAI向量生成接口(/v1/embeddings......
  • 深度学习-卷积神经网络-经典的卷积网络incepttion-ResNet-DenceNet-46
    目录1.Inception2.ResNet3.DenseNet4.MobileNet1.Inception其中的一部分:Inception相比之前的VGGLeNet这些都是单条线的Inception多分支并行再concatInception第一版GoogleNet特征总结:NINNetworkinNetworkIncept_v3:NININ套了两次2.ResNet仅仅是......