C语言深度解析:static与extern关键字全指南

news2024/11/15 10:50:07
[大师C语言]合集
[大师C语言(第一篇)]C语言栈溢出背后的秘密[大师C语言(第二十五篇)]C语言字符串探秘
[大师C语言(第二篇)]C语言main函数背后的秘密[大师C语言(第二十六篇)]C语言结构体探秘
[大师C语言(第三篇)]C语言函数参数背后的秘密[大师C语言(第二十七篇)]C语言联合体探秘
[大师C语言(第四篇)]C语言段错误原理研究[大师C语言(第二十八篇)]C语言宏探秘
[大师C语言(第五篇)]C语言随机数背后的秘密[大师C语言(第二十九篇)]C语言函数探秘
[大师C语言(第六篇)]C语言程序不同退出方式背后的秘密[大师C语言(第三十篇)]C语言性能优化背后的技术:深入理解与实战技巧
[大师C语言(第七篇)]C语言命令行参数解析利器:getopt详解[大师C语言(第三十一篇)]C语言编译原理背后的技术:深入理解与实战技巧
[大师C语言(第八篇)]C语言函数如何返回多值技术详解[大师C语言(第三十二篇)]C语言异常处理背后的技术
[大师C语言(第九篇)]C语言函数指针背后技术详解[大师C语言(第三十三篇)]C语言模块化编程背后的技术
[大师C语言(第十篇)]C语言性能优化的技术详解[大师C语言(第三十四篇)]C语言文件操作背后的技术
[大师C语言(第十一篇)]C语言代码注释技术详解[大师C语言(第三十五篇)]C语言Excel操作背后的技术
[大师C语言(第十二篇)]C语言堆排序技术详解[大师C语言(第三十六篇)]C语言信号处理:深入解析与实战
[大师C语言(第十三篇)]C语言排序算法比较与技术详解[大师C语言(第三十七篇)]C语言操作XML:深入解析与实战
[大师C语言(第十四篇)]C语言数据结构技术详解[大师C语言(第三十八篇)]C语言字节对齐技术:深度解析与实战技巧
[大师C语言(第十五篇)]C语言栈背后技术详解[大师C语言(第三十九篇)]C语言const关键字深度解析与实战技巧
[大师C语言(第十六篇)]九种C语言排序算法详解[大师C语言(第四十篇)]C语言volatile关键字深度解析与实战技巧
[大师C语言(第十七篇)]C语言链表背后技术详解[大师C语言(第四十一篇)]C语言指针数组深度解析与实战技巧
[大师C语言(第十八篇)]C语言typedef背后技术详解[大师C语言(第四十二篇)]C语言数组指针深度解析与实战技巧
[大师C语言(第十九篇)]C语言函数式编程技术详解[大师C语言(第四十三篇)]C语言函数指针底层原理深入剖析
[大师C语言(第二十篇)]C语言跨平台编程技术详解[大师C语言(第四十四篇)]C语言static深入剖析
[大师C语言(第二十一篇)]C语言字节对齐技术详解[大师C语言(第四十五篇)]C语言中的数据结构:从基础到高级的全面解析
[大师C语言(第二十二篇)]C语言__attribute__技术详解[大师C语言(第四十六篇)]C语言最危险行为盘点
[大师C语言(第二十三篇)]C语言常用第三方库总结[大师C语言(第四十七篇)]C语言指针数组与数组指针技术详解
[大师C语言(第二十四篇)]C语言指针探秘[大师C语言(第四十八篇)]C语言const深入剖析

d9164eb13bd24e1db5f8e050472782db.jpg

引言

在C语言的广阔天地中,staticextern这两个关键字就像是一对双生子,它们在程序中的作用域、生命周期和链接属性上发挥着至关重要的作用。对于任何希望深入理解C语言并编写出高效、可维护代码的开发者来说,掌握这两个关键字是不可或缺的。本文将作为你的指南,带你深入了解staticextern的原理和用法。

第一章:理解static与extern关键字

1.1 理解作用域

在C语言中,作用域决定了变量或函数的可见性和可用性。作用域分为两种:局部作用域和全局作用域。staticextern关键字在这两种作用域中都有其特定的应用。

1.1.1 局部作用域

局部作用域通常指的是函数内部。在局部作用域内声明的变量,其生命周期仅限于函数的执行期间。

1.1.1.1 static在局部作用域

static用于局部作用域时,它改变了变量的生命周期,使其在程序运行期间持续存在,但其作用域仍然限制在声明它的函数内部。

void func() {
    static int count = 0; // static变量
    count++;
    printf("count is %d\n", count);
}

在上述代码中,尽管count变量在func函数的每次调用时都会被修改,但其值在函数调用之间是保持的。

1.1.2 全局作用域

全局作用域指的是在所有函数之外的区域。在全局作用域内声明的变量,其生命周期是整个程序的运行期间。

1.1.2.1 static在全局作用域

static用于全局作用域时,它将变量的链接属性变为内部的,这意味着该变量只能在声明它的文件中可见。

static int global_var = 10; // 文件作用域的static变量

1.2 生命周期

变量的生命周期是指变量存在的时间范围。对于static变量,无论是在局部作用域还是全局作用域,其生命周期都是整个程序的运行期间。

1.2.1 static的生命周期

static变量的生命周期开始于程序启动,结束于程序终止。它们在程序运行期间始终保持其值,即使它们的作用域已经结束。

1.2.2 extern的生命周期

extern关键字本身并不影响变量的生命周期,它只是声明变量是在其他地方定义的。被extern声明的变量具有全局生命周期,与是否使用extern无关。

1.3 链接属性

在C语言中,链接属性决定了变量或函数在程序中的可见性。staticextern关键字在链接属性上有着不同的作用。

1.3.1 static的链接属性

static用于文件作用域时,它将变量或函数的链接属性设置为内部的,这意味着它们只能在声明它们的文件中访问。

1.3.2 extern的链接属性

extern关键字用于声明一个变量或函数是在其他文件中定义的。这告诉编译器,该变量或函数具有外部链接属性,可以在其他文件中访问。

// file1.c
int external_var = 5; // 定义一个全局变量

// file2.c
extern int external_var; // 声明外部变量

在上述例子中,file2.c通过extern关键字声明了在file1.c中定义的external_var变量。

1.4 小结

在本章中,我们探讨了staticextern关键字在C语言中的作用域、生命周期和链接属性。这两个关键字虽然简单,但它们对于编写结构清晰、模块化、易于维护的C代码至关重要。在接下来的章节中,我们将通过具体的实例进一步深化对这些关键字的理解和应用。

第二章:深入理解static关键字

在第一章中,我们初步了解了static关键字在C语言中的作用域、生命周期和链接属性。在本章中,我们将深入探讨static关键字的具体用法,并通过实例来加深对其作用的理解。

2.1 static在局部作用域中的应用

static关键字在局部作用域中的应用,通常是为了在函数调用之间保持变量的状态。

2.1.1 保存函数状态

在下面的例子中,我们将使用static变量来保存一个函数的调用次数。

#include <stdio.h>

void count_calls() {
    static int call_count = 0; // static变量保存调用次数
    call_count++;
    printf("Function has been called %d times.\n", call_count);
}

int main() {
    for (int i = 0; i < 5; i++) {
        count_calls(); // 调用函数
    }
    return 0;
}

在这个例子中,每次调用count_calls函数时,call_count变量都会增加,即使函数调用结束后也不会重置。

2.1.2 限制变量的作用域

使用static关键字可以在局部作用域内创建私有变量,这些变量不会与其他作用域中的同名变量冲突。

void function() {
    static int local_static = 10; // 私有变量
    // ...
}

2.2 static在全局作用域中的应用

static关键字在全局作用域中的应用,通常是为了限制变量的可见性。

2.2.1 创建内部链接变量

在全局作用域中使用static关键字,可以创建只在当前文件中可见的变量。

/* file.c */
static int file_scope_var = 100; // 文件作用域的static变量

void function_in_file() {
    // 可以访问file_scope_var
}

在其他文件中,即使包含了这个文件的头文件,也无法直接访问file_scope_var

2.2.2 避免命名冲突

使用static关键字可以在不同的源文件中使用相同的变量名,而不会引起命名冲突。

/* file1.c */
static int common_name = 1;

/* file2.c */
static int common_name = 2;

在这里,file1.cfile2.c中的common_name变量不会相互冲突,因为它们都是文件私有的。

2.3 static在结构体中的应用

static关键字也可以用于结构体中,以创建静态成员。

2.3.1 结构体中的静态成员

#include <stdio.h>

typedef struct {
    int id;
    static int count; // 静态成员
} Item;

int Item::count = 0; // 静态成员初始化

void create_item(Item *item) {
    item->id = ++Item::count;
}

int main() {
    Item item1, item2;
    create_item(&item1);
    create_item(&item2);
    
    printf("Item 1 ID: %d\n", item1.id);
    printf("Item 2 ID: %d\n", item2.id);
    return 0;
}

在这个例子中,Item结构体的count成员是静态的,它在所有Item实例之间共享。

2.4 小结

在本章中,我们深入探讨了static关键字在C语言中的多种用法。通过局部作用域、全局作用域和结构体中的应用,我们了解了static如何帮助我们在不同场景下保持变量状态、限制变量作用域以及避免命名冲突。在下一章中,我们将转而探讨extern关键字,并学习如何使用它来声明外部变量和函数。

第三章:全面掌握extern关键字

在上一章中,我们详细讨论了static关键字在C语言中的多种用法。本章将转向另一个关键修饰符extern,我们将探讨它的用途、使用场景以及如何通过它来管理跨文件的全局变量和函数。

3.1 extern关键字的基本概念

extern关键字用于声明一个变量或函数在其他地方定义。它告诉编译器,变量或函数的定义将在链接阶段提供,而不是在当前文件中。

3.2 使用extern声明全局变量

全局变量在C语言中具有全局作用域,但默认情况下,它们也具有外部链接属性,这意味着它们可以在其他文件中使用。使用extern可以显式地声明这些变量。

3.2.1 声明外部全局变量

// global.h
#ifndef GLOBAL_H
#define GLOBAL_H

extern int global_var; // 声明外部全局变量

#endif

// main.c
#include "global.h"

int global_var = 10; // 定义全局变量

// other.c
#include "global.h"

void use_global_var() {
    printf("Global var is %d\n", global_var); // 使用extern声明的全局变量
}

在上述代码中,global_varmain.c中定义,并在other.c中使用extern声明,这样就可以在other.c中访问global_var

3.3 使用extern声明函数

与全局变量类似,函数默认具有外部链接属性,可以在其他文件中声明和调用。使用extern关键字可以显式地声明这些函数。

3.3.1 声明外部函数

// functions.h
#ifndef FUNCTIONS_H
#define FUNCTIONS_H

extern void external_function(); // 声明外部函数

#endif

// functions.c
#include "functions.h"

void external_function() {
    // 函数实现
}

// main.c
#include "functions.h"

int main() {
    external_function(); // 调用extern声明的函数
    return 0;
}

在上述代码中,external_functionfunctions.c中定义,并在main.c中使用extern声明,从而可以在main.c中调用该函数。

3.4 extern与static结合使用

在某些情况下,你可能希望将一个变量或函数限制在文件内部,但同时也允许它在文件内的不同源文件之间共享。这时,可以将externstatic结合使用。

3.4.1 文件内部的全局变量

// file1.c
static int file1_var = 20; // 文件内部的全局变量

// file2.c
extern int file1_var; // 声明在file1.c中定义的变量

void use_file1_var() {
    printf("File1 var is %d\n", file1_var);
}

在这里,file1_varfile1.c中定义为static,限制了它的可见性,然后在file2.c中使用extern声明,允许在同一编译单元内共享。

3.5 extern与初始化

需要注意的是,当使用extern声明一个变量时,不应该在声明中进行初始化。初始化应该在变量的定义处进行。

3.5.1 初始化extern声明的变量

// 错误的做法
extern int global_var = 10; // 不应该在extern声明中初始化

// 正确的做法
extern int global_var; // 声明外部变量
// 在其他地方定义并初始化
int global_var = 10;

3.6 小结

在本章中,我们探讨了extern关键字在C语言中的用途,包括如何声明全局变量和函数,以及如何与static结合使用来控制变量和函数的可见性。正确使用extern关键字对于编写模块化和可重用的代码至关重要。在下一章中,我们将通过一些实际案例来巩固staticextern关键字的知识,并展示它们在实际编程中的应用。

第四章:实战演练——static与extern的应用案例

在前三章中,我们详细讨论了staticextern关键字的理论知识。为了将这些理论转化为实践,本章将通过一系列的应用案例,展示这两个关键字在实际编程中的具体应用。

4.1 案例1:使用static实现计数器

问题描述

编写一个简单的计数器函数,每次调用时增加计数,并打印当前计数。

解决方案

使用static变量在函数调用之间保持计数状态。

#include <stdio.h>

void counter() {
    static int count = 0; // static变量保持计数状态
    count++;
    printf("Current count: %d\n", count);
}

int main() {
    for (int i = 0; i < 5; i++) {
        counter(); // 调用计数器函数
    }
    return 0;
}

4.2 案例2:使用extern共享全局配置

问题描述

在多个源文件中共享一个全局配置变量。

解决方案

在头文件中声明extern变量,并在一个源文件中定义它。

// config.h
#ifndef CONFIG_H
#define CONFIG_H

extern int config_value; // 声明外部全局变量

#endif

// config.c
#include "config.h"

int config_value = 100; // 定义全局配置变量

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

int main() {
    printf("Global config value: %d\n", config_value);
    return 0;
}

4.3 案例3:使用static限制函数作用域

问题描述

在一个源文件中定义一个辅助函数,但不希望它在其他文件中被使用。

解决方案

在源文件中使用static关键字定义函数。

// helper.c
static void helper_function() {
    // 辅助函数的实现
    printf("Helper function is called.\n");
}

void public_function() {
    helper_function(); // 在同一文件内调用辅助函数
}

// main.c
#include "helper.h"

int main() {
    public_function(); // 调用公共函数
    // helper_function(); // 错误:无法在main.c中调用
    return 0;
}

4.4 案例4:使用extern与static结合管理库

问题描述

创建一个库,其中包含一些公共函数和一些私有函数。

解决方案

在库的头文件中使用extern声明公共函数,在源文件中使用static定义私有函数。

// library.h
#ifndef LIBRARY_H
#define LIBRARY_H

extern void public_library_function(); // 声明公共函数

#endif

// library.c
#include "library.h"

static void private_library_function() {
    // 私有函数的实现
}

void public_library_function() {
    private_library_function(); // 调用私有函数
    printf("Public library function is called.\n");
}

4.5 小结

本章通过四个实际案例,展示了staticextern关键字在实际编程中的应用。这些案例帮助我们将理论转化为实践,加深了对这两个关键字的理解。通过这些案例,我们学会了如何使用static来保持函数状态、限制作用域,以及如何使用extern来共享全局变量和声明跨文件的函数。在后续的编程实践中,灵活运用这些知识将有助于编写更加高效和可维护的C语言代码。

第五章:高级话题——static与extern的深度探索

在前面的章节中,我们已经探讨了staticextern关键字的基础和实际应用。本章将深入挖掘这两个关键字的一些高级话题,包括它们在多文件项目中的使用、与编译器优化相关的注意事项,以及一些常见的误区和最佳实践。

5.1 多文件项目中的static与extern

在大型C语言项目中,通常会将代码分散到多个源文件中。在这种情况下,staticextern关键字变得尤为重要。

5.1.1 管理跨文件的全局变量

使用extern关键字可以在不同的源文件之间共享全局变量,而static关键字则可以限制全局变量的作用域。

// global.h
#ifndef GLOBAL_H
#define GLOBAL_H

extern int shared_global; // 声明为extern,以便在其他文件中使用

#endif

// file1.c
#include "global.h"

int shared_global = 1; // 定义并初始化全局变量

// file2.c
#include "global.h"

void use_shared_global() {
    printf("Shared global is %d\n", shared_global);
}

5.1.2 跨文件函数的声明与定义

对于跨文件的函数,extern用于声明函数原型,而函数定义可以在另一个源文件中。

// functions.h
#ifndef FUNCTIONS_H
#define FUNCTIONS_H

extern void cross_file_function(); // 函数原型声明

#endif

// functions.c
#include "functions.h"

void cross_file_function() {
    // 函数定义
}

// main.c
#include "functions.h"

int main() {
    cross_file_function(); // 调用跨文件函数
    return 0;
}

5.2 编译器优化与static

编译器在优化代码时,会考虑static关键字。了解这些优化可以帮助我们编写更高效的代码。

5.2.1 static变量的优化

由于static变量的生命周期是整个程序运行期间,编译器可能会将其存储在内存中的固定位置,从而提高访问速度。

5.2.2 static函数的优化

编译器可能会对static函数进行内联优化,因为它们不会在程序的其他部分被调用。

5.3 常见误区与最佳实践

在使用staticextern关键字时,开发者可能会遇到一些误区。以下是一些常见的误区和对应的最佳实践。

5.3.1 误区:在头文件中定义变量

在头文件中定义变量可能会导致重复定义错误。正确的做法是在头文件中声明变量,在源文件中定义。

// 错误:在头文件中定义变量
// header.h
int global_var = 0; // 错误的定义

// 正确:在头文件中声明,在源文件中定义
// header.h
extern int global_var; // 正确的声明

// source.c
#include "header.h"
int global_var = 0; // 正确的定义

5.3.2 误区:在extern声明中初始化变量

extern声明中初始化变量是错误的,因为extern声明仅用于告诉编译器变量在其他地方定义。

// 错误:在extern声明中初始化变量
extern int global_var = 0; // 错误的做法

// 正确:在extern声明后,在源文件中定义并初始化
extern int global_var; // 正确的声明
int global_var = 0; // 正确的定义

5.3.3 最佳实践:使用命名约定区分static变量

为了提高代码的可读性,可以使用命名约定来区分static变量和全局变量。

// 命名约定
static int file_private_var; // 文件私有的static变量
int global_var; // 全局变量

5.4 小结

本章深入探讨了staticextern关键字在多文件项目中的使用、编译器优化相关的注意事项,以及一些常见的误区和最佳实践。通过本章的学习,我们应该能够更加熟练地运用这两个关键字,编写出更高效、更可维护的C语言代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2047272.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Electron 集成 Express + p-limit + SQlite WAL读写模式解决并发锁库的问题

背景 经过通信层面的优化后&#xff0c;我们不再走 Electron 提供的内置进程间通信 IPC&#xff0c;改为利用 Express 提供的 Http 本地服务来进行多处直达通信机制&#xff0c;同时利用本地 Sqlite 来保存大量数据&#xff0c;但 Express 提供的本地服务是支持并发请求的&…

食品零食小吃商城管理系统-计算机毕设Java|springboot实战项目

&#x1f34a;作者&#xff1a;计算机毕设残哥 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目、 源…

DataX二次开发之达梦数据库插件

达梦数据库自定义插件 达梦8的依赖引入定义reader module定义writer module修改核心配置数据库类型支持打包插件测试 以mysql到dm数据库为例配置mysql2dm.json执行任务查询下结果 DataX二次开发之达梦数据库插件 DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,支持…

eNSP 华为远程登录路由器

华为远程登录路由器 前提&#xff1a;主机能与路由器通信就行&#xff0c;如果不同网段就配路由协议&#xff0c;这里直接模拟直连通信 Cloud&#xff1a; R&#xff1a; <Huawei>sys [Huawei]sys R [R]int g0/0/0 [R-GigabitEthernet0/0/0] [R-GigabitEthernet0/0/0]i…

AQS 原理详解

日常开发中&#xff0c;我们经常使用锁或者其他同步器来控制并发&#xff0c;那么它们的基础框架是什么呢&#xff1f;如何实现的同步功能呢&#xff1f;本文将详细讲解构建锁和同步器的基础框架--AQS&#xff0c;并根据源码分析其原理。 一、什么是 AQS&#xff1f; (一) AQS…

Oracle+ASM+High冗余详解及空间计算

Oracle ASM&#xff08;Automatic Storage Management&#xff09;的High冗余模式是一种提供高度数据保护的策略&#xff0c;它通过创建多个数据副本来确保数据的可用性和安全性。 以下是关于Oracle ASM High冗余的详细解释&#xff1a; 一、High冗余的特点 1.数据冗余度 在Hi…

Java | Leetcode Java题解之第342题4的幂

题目: 题解&#xff1a; class Solution {public boolean isPowerOfFour(int n) {return n > 0 && (n & (n - 1)) 0 && n % 3 1;} }

【Datawhale AI夏令营第四期】 魔搭-大模型应用开发方向笔记 Task03 大咖项目分享 人话八股文Bakwaan_Buddy项目开发尝试

【Datawhale AI夏令营第四期】 魔搭-大模型应用开发方向笔记 Task03 人话八股文Bakwaan_Buddy项目开发尝试 Idea: 我们草台班子目前的想法是解决大家计算机学院毕业面临的BUG——不爱背、背不下来八股文&#xff0c;觉得枯燥、烦、工作了用不着&#xff0c;反正就是知识他不进…

Python酷库之旅-第三方库Pandas(085)

目录 一、用法精讲 356、pandas.Series.str.isnumeric方法 356-1、语法 356-2、参数 356-3、功能 356-4、返回值 356-5、说明 356-6、用法 356-6-1、数据准备 356-6-2、代码示例 356-6-3、结果输出 357、pandas.Series.str.isdecimal方法 357-1、语法 357-2、参数…

RabbitMQ的核心概念

RabbitMQ是一个消息中间件&#xff0c;也是一个生产者消费者模型&#xff0c;负责接收&#xff0c;存储和转发消息。 核心概念 Producer 生产者&#xff0c;是RabbitMQ Server的客户端&#xff0c;向RabbitMQ发送消息。 Consumer 消费者&#xff0c;是RabbitMQ Server的客…

Ps:首选项 - 单位与标尺

Ps菜单&#xff1a;编辑/首选项 Edit/Preferences 快捷键&#xff1a;Ctrl K Photoshop 首选项中的“单位与标尺” Units & Rulers选项卡允许用户根据工作需求定制 Photoshop 的测量单位和标尺显示方式。这对于保持工作的一致性和精确性&#xff0c;尤其是在跨设备或跨平台…

mybatis plus 查询部分源码分析,typehandler怎么实现的?FastjsonTypehandler 查询问题怎么解决?

我们在使用mysql的json字段的时候有时为了方便&#xff0c;最好是查询的时候直接反序列化为对象比较好&#xff0c;这时候我们就用到了typehandler这个属性 首先mybatis plus 会初始化一系列的 typeHandler,并且扫描用户设置的typeHandler路径&#xff08;mybatis-plus: type-…

Flutter-->AAPT: error: resource android:attr/lStar not found.

更新Flutter 3.24.0之后, 打包出现AAPT: error: resource android:attr/lStar not found.问题, 这里出一个我的解决方案. 更新Flutter 3.24.0之后, Android编译sdk需要使用34, 否则就会出现很多问题… 由于很多库都不可能及时更新适配到Android sdk 34, 所以可以等pub get将子…

硅谷物理服务器有哪些关键优势和特点

硅谷的物理服务器设施全球知名&#xff0c;为各类企业提供了卓越的IT基础设施支持。下面将逐一探讨硅谷物理服务器的关键优势和特点&#xff0c;rak小编为您整理发布硅谷物理服务器有哪些关键优势和特点。 1. 卓越的性能 高性能计算能力&#xff1a;硅谷的物理服务器采用最新一…

Authentik:开源身份提供商

Authentik 是一个开源身份提供商&#xff0c;旨在实现最大的灵活性和适应性。 它可轻松集成到现有环境中并支持新协议。 它是一个全面的解决方案&#xff0c;用于在您的应用程序中实现注册、帐户恢复等功能&#xff0c;无需手动管理这些任务。 Authentik 可以无缝集成到现有…

arcgis打开不同tif格式编码的栅格数据

1、如下图&#xff0c;将文件包包解压打开&#xff0c;看到【2020年GDP数据】。 2、点击进入【2020年GDP数据】文件夹如下图所示。接着去打开arcgis软件。 3、按照步骤来&#xff0c;在arcgis【目录】里面添加【文件夹】然后选中你刚刚解压的【GDP文件夹数据】&#xff0c;最…

21 注意力机制—自注意力

目录 1.自注意力和位置编码跟CNN,RNN对比位置编码(position encoding)1、和 CNN / RNN 不同,自注意力并没有记录位置信息2、为了使用序列的顺序信息,通过在输入表示中添加位置编码将位置信息注入到输入里3、P 的元素具体计算如下:位置编码矩阵绝对位置信息相对位置信息总…

Linux运维篇-yum命令报错 /lib64/libcurl.so.4相关

目录 项目场景&#xff1a;问题描述原因分析&#xff1a;解决方案&#xff1a; 项目场景&#xff1a; centos7&#xff0c;8&#xff0c;同样也适用openEuer&#xff0c;Kylin等redhat系的国产化操作系统 问题描述 在使用yum命令时报错&#xff1a; 主要报错信息为&#xff1…

诈骗未成功是否构成犯罪?

诈骗未成功不一定构成犯罪。在刑法上&#xff0c;构成诈骗罪需要满足特定的构成要件&#xff0c;包括有非法占有的目的、实施了虚构事实或隐瞒真相的行为、对方因此陷入错误认识并处分财产、行为人或第三方取得财产、被害人遭受财产损失。如果诈骗行为未能成功&#xff0c;即被…

[C#]基于winform结合photocartoon算法实现人物卡通化源码实现

【官方框架】 https://github.com/minivision-ai/photo2cartoon 简介 人像卡通风格渲染的目标是&#xff0c;在保持原图像ID信息和纹理细节的同时&#xff0c;将真实照片转换为卡通风格的非真实感图像。我们的思路是&#xff0c;从大量照片/卡通数据中习得照片到卡通画的映射…