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

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代码如何编译使用可见:
 
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关键字则会告诉编译器,此函数是内联函数,希望编译器尽可能的在编译阶段将此函数展开到调用此函数的地方,且对此内联函数按照常规函数一样进行语法检查,比如入参类型,入参个数等。
posted @ 2024-02-25 23:14  lethe1203  阅读(27)  评论(0编辑  收藏  举报