c语言变量和函数声明的修饰符static,extern,#define,const

C语言关键字深度解析:从static、volatile到模块化编程实战 在C语言编程中,数据类型、存储类别和流程控制是构建程序的基础。数据类型关键字如int、char定义了数据的存储格式,而存储类别关键字如static、extern则决定了变量的生命周期与作用域,这是理解程序内存布局的关键。深入掌握这些概念,能显著提升代码的效率和可维护性,尤其在嵌入式系统开发中,对volatile关键字的正确使用,能确保程序与硬件寄存器的可靠交互。本文聚焦于static、const、volatile等核心关键字,通过模块化编程、多线程同步等典型应用场景,剖析其底层原理与实战技巧,帮助开发者避免 阅读详情

写的比较乱,因为是刚开始学C,没有一个系统的概念,都是想到什么,测试到什么就添加什么,仅供参考
而且可能会有错误的地方,如果有请指出

static:静态

作用域以及声明方法:

1、在函数中声明则仅作用于该函数

void fun(){
    static int i;
}

2、在函数外声明则作用与从声明开始到文件末尾

static int i;
void fun(){
}

extern:引用(其他c文件)

作用域以及声明方法:

1、可以声明变量或函数,并且不必变量初始化或函数定义实现,即可使用,因为引用变量或函数声明时,会同时引用被引用文件内的初始化语句
2、被引用的变量或函数不能被static修饰
3、相当与引用(复制?)其他文件中的声明和定义/初始化语句到本文件的声明位置
4、在本文件使用extern声明变量或函数时,变量或函数名以及函数返回类型和函数参数列表应与要引用的变量或方法一致(经测试,变量不一致时好像类似声明的指针类型变量,方法暂未测试)
5、在函数内声明则类似局部变量,作用域仅在本函数,在函数外,作用域从声明处到文件末尾
6、如果你是学习C语言的新手,而且暂时只是在使用文本编辑器在写C程序,那么需要注意,在编译有extern语句的C文件时,应该与被引用的文件一起编译(笔者表示在开始时一直在单独编译一个文件所以一直编译报错)
比如下面例子的a1.c和b.c,或者a2.c和b.c,编译的时候应该这样:

gcc a1.c b.c
/* 或者 */
gcc a2.c b.c
/* 这样编译器才能找到被extern的变量或函数 */

不要将a1.c和a2.c以及b.c这三个一起编译,应该将a1.c和b.c一起编译,或者a2.c和b.c一起编译,这是两个例子

/* a1.c */
/* 在文件开始声明(将类似全局变量) */
#include <stdio.h>
extern int test1;
extern void testFun1();
extern int testFun2(int temp);
int main(){
    int temp=20;
    testFun1();
    testFun2(temp);
    return 0;
}
/*####################*/
/* a2.c */
/* 在函数内部声明(将类似局部变量) */
#include <stdio.h>
void myFun1();
int main(){
    myFun1();
    return 0;
}
void myFun1(){
    extern int test1;
    extern void testFun1();
    extern int testFun2(int temp);
    int temp=30;
    testFun1();
    testFun2(temp);
}
/*####################*/
/* b.c */
#include <stdio.h>
int test1=10;
void testFun1(){
    printf("test1 in testFun1():%d\n",test1);
}
int testFun2(int temp){
    test1=temp;
    printf("test1 in testFun2():%d\n",test1);
    return 0;
}

“#define”:常量

作用域以及声明方法:

1、在函数内声明则作用域仅在本函数,在函数外,作用域从声明处到文件末尾,不过大多在文件头,include语句下声明
2、定义后无法再次对其赋值
3、声明时末尾不能使用分号结束,不能声明数据类型(也就是没有数据类型),不能有等号

#include <stdio.h>
#define a 1
int main(){
    printf("a:%d\n",a);
    return 0;
}
/* 另一个例子 */
#include <stdio.h>
void test1();
int a;
int main(){
    test1();    
    printf("a:%d\n",a);
    return 0;
}
void test1(){
    #define a 1
    printf("a:%d\n",a);
}

const:常量

作用域以及声明方法:

1、在函数内声明则作用域仅在本函数,在函数外,作用域从声明处到文件末尾,不过大多在文件头,include语句下声明
2、定义后无法再次对其赋值
3、需要指定数据类型,并使用等号为其赋值,否则,则只能有默认值(因为在程序其他位置无法再次对其赋值)

#include <stdio.h>
const int a=10;
int main(){
    printf("a:%d\n",a);
    return 0;
}
C语言32个关键字深度解析:从内存模型到编译链接实战 在编程语言中,关键字是构建程序逻辑的基础元素,它们定义了数据类型、控制流程和存储方式等核心概念。理解关键字的底层原理,有助于掌握程序在内存中的布局、编译器的优化行为以及多文件项目的组织方式。从技术价值看,深入理解关键字能帮助开发者编写更高效、更健壮的代码,避免内存错误和未定义行为。在实际应用场景中,无论是嵌入式开发、系统编程还是性能优化,对关键字的精准运用都至关重要。本文聚焦C语言的32个关键字,通过剖析static、extern、const、volatile等热词,结合内存模型和编译链接过程,揭示其在模块 阅读详情

相关推荐

C语言关键字深度解析:从语法基石到实战避坑指南

在编程语言中,关键字是构成程序逻辑和数据结构的核心语法元素,它们定义了数据类型、控制流程和存储方式。理解其底层原理是编写高效、健壮代码的基础,对于系统编程、嵌入式开发和性能优化具有重要价值。本文聚焦于C语言中的关键字,深入探讨了`const`、`static`、`volatile`等关键字的实际应用场景与常见误区。例如,`const`不仅用于定义常量,更是编写安全API和提供编译器优化提示的重要工具;而`static`在管理变量生命周期和实现模块化封装中扮演着关键角色。通过剖析这些核心概念,旨在帮助开发者规

weixin_34262482的博客 320

一次学会C#十二大修饰符

在快速入门教程中已经疏解了一些面向对象的基本概念,但并不深入,只对类的构造和继承做了简单的介绍。下面将深入理解C#的面向对象,文集中针对12个修饰符以及接口,从内到外对类进行展开讲解。

微小冷的学习笔记 3205

C/C++ extern关键字详解:解决未定义引用与跨文件函数调用

在C/C++程序开发中,编译与链接是两个核心构建阶段。编译阶段将每个源文件独立转换为目标文件,而链接阶段则负责将多个目标文件合并为最终可执行程序。这一过程的核心挑战在于符号解析,即确保函数和变量在不同编译单元间的正确引用。extern关键字在此扮演关键角色,它声明函数或变量具有外部链接属性,告知编译器其定义位于其他文件,由链接器最终解析。这一机制是实现代码模块化、支持多文件项目的基础。在C++与C混合编程场景中,由于C++的名称修饰特性,需使用extern "C"指令确保符号兼容性。理解extern的原理与

weixin_30266885的博客 327

C语言中的几种关键字(修饰符)

register 用 register 修饰的变量称为寄存器变量,与普通变量相比,处理、访问的速度更快,因为变量是存储在寄存器中;但是正因为它是存储在寄存器中的,所以无法获取寄存器变量的地址。并且在有的情况下对寄存器变量的处理速度会下降至和普通变量一样。并且可以用 register 来修饰的数据类型是有限的。 static 用 static 修饰的变量的作用域仅在变量所在文件内,其他文件无法访问、修改此变量。该类变量如果没有显示的初始化,则会被隐式的初始化为0。 extern 用于在当前文件中访问其它文件中

qq_43940175的博客 1053

C语言关键字深度解析:从语法基础到高级应用

在编程语言中,关键字是编译器能够直接识别的保留标识符,它们定义了语言的核心语法和基本操作。理解关键字的原理对于掌握编程语言至关重要,它不仅关系到代码的正确编译,还影响着程序的性能优化和底层硬件交互。从技术价值来看,关键字是连接高级语言抽象与底层硬件实现的桥梁,例如通过static控制变量生命周期,利用volatile处理硬件寄存器访问。在实际应用场景中,关键字广泛应用于嵌入式系统开发、操作系统内核编程以及性能敏感的系统软件编写。本文聚焦C语言的32个关键字,深入探讨static、const、volatile

congsikuai0611的博客 390

MATLAB/Simulink与ThingSpeak集成:打通物联网数据与工业算法仿真的闭环

在工业算法开发与控制系统设计中,模型仿真与真实世界数据的脱节是常见的工程挑战。其核心原理在于构建一个双向数据流闭环,将虚拟的仿真模型与物理世界的传感器网络连接起来。这一技术方案的核心价值在于大幅缩短算法迭代周期,实现数据驱动的设计与验证。典型的应用场景包括数字孪生构建、预测性维护和硬件在环(HIL)测试的云端化。通过将MATLAB/Simulink这一强大的模型化设计环境,与ThingSpeak物联网云平台进行深度集成,工程师能够轻松地将实时或历史的物联网数据流直接注入仿真模型作为输入,同时将仿真结果实时回

weixin_34220179的博客 469

c语言中的修饰符大全

6. volatile:易失变量修饰符,用于定义易失变量,易失变量的值可能会被意外修改,编译器不会对其进行优化。3. static:静态变量,用于在函数内部或全局范围内定义静态变量,静态变量在程序执行期间只被初始化一次。2. register:寄存器变量,用于定义存储在寄存器中的变量,不能对寄存器变量使用取地址符。4. extern:外部变量,用于在一个文件中引用另一个文件中定义的全局变量或函数。5. const:常量修饰符,用于定义常量,常量的值不能被修改。

2301_79584946的博客 1563

NHANES数据库实战:数据合并与加权分析技巧

本文详细解析了NHANES数据库实战中的核心技巧,重点阐述了数据合并与加权分析的正确方法。通过两个具体案例,手把手指导如何从数据下载、合并、权重计算到使用R语言survey包进行加权统计分析,避免因忽略复杂抽样设计而导致的研究偏倚,确保分析结果的准确性与可发表性。

weixin_29057065的博客 585

C语言修饰符

类型修饰符 类型修饰符必须放在它所修饰的类型名zhi

一个不甘寂寞的编程之路 6338

Tecplot进阶:巧用公式与多Frame对比,实现CFD多工况数据差异的可视化分析

本文详细介绍了如何利用Tecplot进行CFD多工况数据差异的可视化分析,通过公式计算和多Frame对比,实现变量差值自动计算、多视图同步展示和差异量化统计。文章还提供了数据准备、基础操作、实战技巧和常见问题解决方案,帮助工程师高效完成CFD后处理工作。

weixin_29227425的博客 528

别再乱提MR了!手把手教你配置GitLab的CI/CD与分支保护规则,让团队协作更丝滑

本文详细介绍了如何配置GitLab的CI/CD与分支保护规则,以优化团队协作流程。通过设置Protected Branches、MR流水线检查和自动化审批规则,有效防止不规范操作和合并冲突,提升开发效率与代码质量。特别强调MR(Merge Request)的正确使用,确保团队协作更丝滑。

weixin_28840591的博客 234

C++ 变量作用域

C++ 变量作用域 在函数或一个代码块内部声明的变量,称为局部变量。 在函数参数的定义

Kp0fS的草稿纸 163

移动端实战指南:深入理解 & 接入 IAB OMSDK

OMSDK(OpenMeasurementSDK)是IABTechLab推出的标准化测量工具,用于统一移动端/原生App广告的可见性和验证流程。其核心包括Native库(采集设备数据)和OMID JavaScript层(实现通信),通过标准化接口让开发者只需接入一套SDK即可兼容多个测量厂商,减少冲突和性能损耗。v1.4版本强化了对CTV和原生App场景的支持,而v1.5新增了画中画检测等功能。集成流程需通过IAB技术实验室注册下载,并遵循严格的命名空间规则。测试阶段需嵌入验证脚本并通过指定工具验证

帅次的博客 1187

C 语言关键字详解:enum、typedef、#define、const、extern、register、auto

本文详解 C 语言的关键字。enum 定义自增整数常量集,提升可读性;对比 typedef 与 #define,前者编译期创类型别名且有类型检查,后者预处理替换无检查。const 修饰变量、指针、函数,C 与 C++ 中用法有差异。extern 实现跨文件变量 / 函数访问,extern "C" 助 C++ 兼容 C 代码。register 建议变量存 CPU 寄存器,有使用限制;auto 在 C 中修饰栈中局部变量,C++11 后作类型推断。

weixin_73308349的博客 701

【系统架构设计师-2026上半年真题】综合知识-参考答案及详解(75题完全回忆版)

【系统架构设计师-2026上半年真题】综合知识-参考答案及详解(75题完全回忆版)

数据知道的博客 3101

RT-DETR改进策略【小目标改进】| Shape-NWD:融合改进,结合Shape-IoU和NWD 更好地适应小目标特性

Bw−wgt2h−hgt2weight2Bweight2w−wgt​2h−hgt​2​其中weight2weight = 2weight2。

Limiiiing的博客 1544

C/C++>const,extern

C/C++>const,extern

qq_42069216的博客 612

【生产实践】PostgreSQL高可用Patroni安装(超详细已踩坑)

一 安装Patroni 0 Patroni 对Python的版本要求 我安装的是Patroni最新版本 :4.0.3,Patroni 对Python 版本有要求,没有具体的版本矩阵,但是根据每个版本发布信息可以得到以下信息 Patroni 4.0 需要 Python 3.8 以上(可以根据下面发布版本信息推理出) Version 3.0.2 Version 3.0.2 dropped support of Python older than 3.6. 版本3.0.2不再支持3.6版本以下的P

DBA之路的博客 1739

【C语言】extern关键字:跨文件共享数据的桥梁与实战避坑指南

本文深入解析C语言中extern关键字的作用与实战应用,通过桥梁比喻形象说明其在跨文件共享数据中的重要性。详细介绍了extern的基本用法、头文件最佳实践及常见陷阱,帮助开发者避免重复定义和初始化错误。同时探讨了extern在模块化开发和性能优化中的高级应用,为C语言项目提供实用指南。

weixin_30781107的博客 362

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

嵌入式八股文总结(C语言篇)

最近正在准备秋招,在此每天记录一些面试常问的八股文,希望可以和大家一起进步。(持续更新中……)

小海螺的博客 3万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

嵌入式面试知识点总结 -- C语言篇

之前有写过 日常生活 – 嵌入式面试 ,讲了面试大部分都会问哪些问题。 也有自己总结了一些面试题: C语言再学习 – 详解C++/C 面试题 1 C语言再学习 – 详解C++/C 面试题 2 但是每次我都要翻好几篇文章按着看知识点,这就很烦了。现在将所用到的知识点在这篇文章内加以总结。 ...

不积跬步,无以至千里 7406

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

C语言volatile与extern关键字:嵌入式开发中的编译器优化与模块化编程

在C语言编程中,理解内存模型和编译器行为是编写可靠底层代码的基础。编译器优化通过减少内存访问提升性能,但在嵌入式和多线程场景中,这可能导致数据同步问题。volatile关键字正是为此而生,它强制编译器每次从内存读取变量值,确保对硬件寄存器、中断共享变量等易变数据的访问正确性。extern关键字则解决了模块化编程中的符号可见性问题,通过分离声明与定义,实现跨文件变量和函数的共享。结合嵌入式开发实践,这两个关键字共同保障了程序在底层硬件交互和多模块协作中的稳定运行,是嵌入式系统、驱动开发等领域的必备知识。

weixin_30443731的博客 367

C/C++常见笔试面试题之常考关键字

对笔试面试中C/C++常考关键字进行了整理,包括volatile、const、static、extern、new/delete和malloc/free等。希望这些知识点有帮助!

云鹤起舞的博客 3603

嵌入式 C语言常见面试试题集锦

C 面试试题集锦

u013464897的博客 3017

C语言06-函数与预处理指令

本文介绍了C语言函数的定义、调用、参数传递及递归等核心概念,重点讲解了函数设计原则(模块化、高内聚低耦合)、变量作用域与生命周期(局部/全局变量)、四种存储类型(auto/register/extern/static)及内存分区管理。同时详细解析了预处理指令(#include/#define/条件编译)的使用场景与技巧,包括宏定义与函数的区别、头文件包含规范以及条件编译在代码调试和跨平台开发中的应用。通过实例代码(如阶乘递归、汉诺塔、数组排序等)演示了关键技术的实际应用,为C语言开发提供了全面指导。

weixin_53143624的博客 842

深入解析extern “C“:解决C/C++混合编程链接问题的核心技术

在C/C++混合编程中,链接器报错是常见的技术挑战,其根源在于两种语言对函数名的处理机制不同。C语言采用简单的符号命名规则,而C++引入了名字修饰机制以支持函数重载、命名空间等高级特性,这导致编译后的符号名无法直接匹配。extern "C"作为链接指示符,能够强制C++编译器按照C语言的规则处理函数名,确保跨语言调用的符号一致性。这一技术对于集成第三方C库、实现底层驱动与上层应用的交互具有重要价值,特别是在嵌入式开发、音视频处理等需要高性能底层库的场景中。通过合理使用extern "C",开发者可以高效解决

weixin_30443747的博客 328
上一篇: Android开发中常用的跳转系统自带界面方法(ACTION)
下一篇: C语言中的指针-记录个人理解
listenerri
博客等级 码龄12年 39粉丝 66原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值