首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C语言笔记】带定义(一)

其中DSP与FPGA通过两个带进行数据交互(DSP与FPGA通过一块共享内存来实现数据交互,我这边DSP只要往共享内存中写入数据即为往FPGA中写数据,往共享内存中读取数据就是读取FPGA发送过来数据...volatile在嵌入式编程中用得很多,如在Cortex-M3内核MCU内核文件C函数内嵌汇编中使用了大量volatile关键字: ?...关于volatile关键字更多介绍可查看往期分享: 【C语言笔记】volatile关键字 ((volatile uint32*)base_addr)[(offset)]意思是相对于base_addr...以上两个带测试用例 /******************************************************************************** * 函数FPGA_WRITE...可见,程序输出结果与我们分析一致!带很重要,在一定程度上可以帮助我们防止出错,提高代码可移植性和可读性等,应重点掌握。下一篇笔记我们将分享更多笔记,欢迎阅读。----

1.3K40

C语言笔记】带定义(二)

关于C程序编译原理可查看往期笔记:【C语言笔记】C语言编译过程关于windows系统下使用gcc编译器方法可参考往期笔记:【C语言笔记】使用notepad++、MinGW来开发C程序 以上程序严谨求平方函数定义如下...可见,这才是我们要正确结果。 带到底有多重要,看看TI一些官方例程就知道,其把很多算法使用带封装起来,用户就可以很方便使用。 带—— clarke变换算法: ?...带—— PI调节器算法: ? 这些.h文件都使用来封装各种算法: ? 同样,ST官方固件库中也大量使用带: ? ? ? 可见带定义重要性!...带与函数区别 查看以上带,我们发现带似乎与函数似乎长得很像,它们之间有什么区别和联系呢?TI为什么要使用来对一些算法进行封装呢,难道使用函数来封装不可以吗?答案是可以: ?...缺点 可能会大幅度增加程序长度。 是没法调试由于与类型无关,也就不够严谨。 可能会带来运算符优先级问题,即二义性。 以上就是关于带一些总结,如有错误,欢迎指出!

2.9K10
您找到你想要的搜索结果了吗?
是的
没有找到

C语言定义

不带参数定义方式如下(这也是我们经常用到定义) #define 名 字符串 //没有分号,说没有分号倒不如说最好不要加分号         这里说下原因吧:因为定义它并不是C语言语句,所以不用加分号...名实际上就是一个标识符,必须要符合C语言当中标识符语法规定。         标识符规则:字母、数字、下划线,不以数字开头,注意:关键字不能作为标识符!...注意:参数是先完成替换,不是先计算然后再进行传。...命名事项         相信有些小伙伴已经发现了这个函数使用语法和函数是非常类似滴。所以语言本身就会没办法帮我们区分二者一些使用。...,那么现在我们用BSC充当C++风格注释。

23710

C语言定义

简单定义 简单定义有如下格式: [#define指令(简单)]  #define 标识符替换列表 替换列表是一系列C语言记号,包括标识符、关键字、数、字符常量、字符串字面量、运算符和标点符号...虽然简单常用于定义常量名,但是它们还有其他应用。 4) 、可以对C语法做小修改。实际上,我们可以通过定义方式给C语言符号添加别名,从而改变C语言语法。...例如,对于习惯使用Pascalbegin和end(而不是C语言{和})程序员,可以定义下面的: #define BEGIN { #define END } 我们甚至可以发明自己语言。...##运算符 在C语言中,"##"被称为 连接符(concatenator),它是一种预处理运算符, 用来把两个语言符号(Token)组合成单个语言符号。...(name)中有一个"##",它作用一如之前所说,是一个连接符,将zif和变量name值连接起来。

5.9K10

excel编程 c语言,(巨集)

用途在于自动化频繁使用序列或者是获得一种更强大抽象能力——但这常常是一回事。 计算机语言C语言或汇编语言有简单系统,由编译器或汇编器预处理器实现。...C语言预处理器工作只是简单文本搜索和替换,使用附加文本处理语言如M4,C 程序员可以获得更精巧。...Lisp类语言如Common Lisp和Scheme有更精巧系统: 行为如同是函数对自身程序文本变形,并且可以应用全部语言来表达这种变形。...一个 C 可以定义一段语法替换,然而一个 Lisp 却可以控制一节代码计算。 获得了控制代码执行顺序(见惰性计算和非限制函数)能力,使得新创建语法结构与语言内建语法结构不可区分。...== 语言 == 语言是一类编程语言,其全部或多数计算是由扩展完成语言并未在通用编程中广泛使用,但在文本处理程序中应用普遍。

1.6K20

C语言 | offsetof和container_of

今天分享C语言两个,这两个包含了指针和结构体知识,非常具有代表性。另外,这个题目曾经是大疆无人机一道笔试题,可见,这两个C语言基础还是有一定要求。...废话不多说,今天要说两个分别是offsetof和container_of,第一个是用来计算结构体中某个成员相对于结构体偏移量,第二个是已知指向结构体某个成员指针,来计算结构体指针。...我们知道,C语言给我们提供了一个很好方式去访问结构体成员,比如结构体变量我们可以用点.去访问,结构体指针我们可以用->去访问,这两种访问方式本质上是通过指针进行访问,只不过这个过程是编译器帮我们处理了...,还要知道变量类型,所以C语言帮我们考虑了这一点,使用简单方式就行了。...既然C语言帮我们做了计算偏移量这件事情,那我们是不是可以反过来利用一下它,先通过点方式访问变量,再对变量进行取地址运算,减去结构体首地址不就是变量偏移量了吗?

2.1K30

C语言定义技巧

C语言定义技巧(常用定义) 写好C语言,漂亮定义很重要,使用定义可以防止出错,提高可移植性,可读性,方便性等等。下面列举一些成熟软件中常用得定义。...((c) - 0x20) : (c) ) 13、判断字符是不是10进值数字 #define  DECCHK( c ) ((c) >= '0' && (c) <= '9') 14、判断字符是不是16...进值数字 #define  HEXCHK( c ) ( ((c) >= '0' && (c) <= '9') ||\                        ((c) >= 'A' && (c...记住编译程序 也许还提供其它预定义名。 _ LINE _及_ FILE _指令在有关# line部分中已讨论,这里讨论其余名。...加多一层中间转换. 加这层用意是把所有参数在这层里全部展开, 那么在转换那一个(_STR)就能得到正确参数.

2.3K10

简述C语言定义使用

简单定义 无名后不带参数,其定义一般形式为: #define 标识符 字符串 // 不带参数定义 #define MAX 10 注意:不要在定义中放置任何额外符号,比如"="或者尾部加...feral) foo(wolf); else bin(wolf); 判断语言被扩展成: if (!...#运算符 #作用就是将#后边参数进行字符串操作,也就是将#后边参数两边加上一对双引号使其成为字符串。例如a是一个,则替换文本中#a被系统转化为"a",这个转换过程即为字符串化。...,但是C++/C程序员不要定义很复杂定义应该简单而清晰。.../content/13/0125/13/10906019_262310086.shtml 高质量程序设计指南C++/C语言第3版 https://www.cnblogs.com/southcyy/p/10155049

1.6K20

C语言-函数可变形(不定形)

前言 在学习C语言函数章节时发现,给函数传入必须和函数定义原型类型、数量一致才可以正常调用。...1,2,3,4); printf("%s%s%s\n","1","2","3","4"); printf函数是如何实现这种传方式?...可变形本身实现原理 明白了如何定义可变形,接下来就得学习可变形原理,然后学习如何去提取这些传入参数。 (1). 函数是放在栈空间。 (2)....可变形,传入多余参数都是存放在栈空间。 存放内存地址是连续。 理论上只要知道传入参数首地址,就可以推出其他参数地址。...系统标准参数头文件和处理可变形相关函数 #include int vprintf(const char *format, va_list ap); int vfprintf(

79610

C语言 嵌套展开规则

第一时间看干货文章 1 C语言中,是在预编译时用体内容“文本替换”代码中。...先讲一些嵌套展开规则: 一般展开规律像函数参数一样:先展开参数,再分析函数,即由内向外展开; 当中有#运算符时候,不展开参数; 当中有##运算符时候,先展开函数,再分析参数; ##运算符用于将参数连接到一起...利用括号将整个定义内容括起来,保证整个定义中表达式优先运算。 嵌套: 嵌套是使用难点,也是易错点。...1)) -> 展开 TO_STRING1:"a_PARAM(INT_1)" 注意:嵌套展开规则与编译器有关,不同编译器可能对同一个嵌套展开不同。...往期推荐 分享一个开源QT串口示波器 C语言回调函数,提升C技巧必备 用C语言实现状态机设计模式 stm32可以跑Linux操作系统吗?

1.3K20

C语言定义用法

来分享有关c语言里面关于定义用法!...在C语言中,“”分为两种:无参数 和 有参数(这里有参数先不举例子,下面具体分析的话,读者可以详细看到示例来理解这个)。...2、提高程序运行效率: 这里我们就拿带和函数来对比了: (1)定义是在预处理期间处理,而函数是在编译期间处理。...(2)带和带函数一个重要差别就是:定义不会检查参数类型,返回值也不会附带类型;而函数有明确参数类型和返回值类型。...总的来说,如果代码比较多用函数适合而且不影响效率;但是对于那些只有一两句话函数开销就太大了,适合用带。但是用带又有缺点:不检查参数类型。 缺点: 由于是直接嵌入,所以代码可能相对多一点。

2.4K60

C语言笔记】变函数

提到变函数,我们感觉是不是既熟悉又陌生?感觉熟悉是因为我们平时都在使用着,如我们常使用printf()函数与scanf()函数就是典型函数。...因为printf()函数是变函数我们才可以根据我们需要灵活地输出变量值。...要创建变函数需要包含头文件stdarg.h,并且创建变函数应按照如下步骤进行: 【第一步】定义一个使用省略号函数原型,如printf()与scanf()函数原型为 int printf (const...char *__format, ...) int scanf (const char*, ...); 【第二步】在函数定义中创建一个va_list类型变量,用于存储不定参数; 【第三步】用va_start...把该变量初始化为一个参数列表; 【第四步】用va_arg访问参数列表; 【第五步】用va_end完成清理工作。

1.1K40

C 语言函数封装妙招

函数介绍 函数,即包含多条语句定义,其通常为某一被频繁调用功能语句封装,且不想通过函数方式封装来降低额外弹栈压栈开销。...\n"); printf("var_a = %d, var_b = %d\n", var_a, var_b); // var_a = 2, var_b = 1 return 0; } C 语言规定...4. ({}) 方式 ({}) 为 GNU C 扩展语法,非 C 语言原生语法。...({}) 毕竟不是 while 循环,不能直接使用 break退出函数是比较容易理解。那支持返回值是什么意思呢? 答案是 C 语言规定 ({}) 中最后一条语句结果为该双括号体返回值。...优缺点总结: 优点:支持在无花括号且有分支 if 语句中直接调用;有返回值,支持作为表达式右值。 缺点:不支持提前退出函数;非 C 原生语法,编译器可能不支持。 5.

15410

C语言定义与使用

本文链接:https://blog.csdn.net/solaraceboy/article/details/102729793 C语言定义与使用 三种类型预处理指令 定义 是比较常用一种预处理指令...,这里我们主要讨论带参数。...带参数(函数式)定义如下: #define EXAMPLE(x,y,z) 替换列表 注意:在名字和左括号之间没有空格。 优点: 程序可能会更快一些; 更同意。...缺点: 编译后代码通常会变大。 参数没有类型检查。 无法用指针来指向一个可能会不止一次地计算它参数。...文件包含 条件编译 适用于预处理指令规则 指令都以 # 开始 在指令符号之间可以插入任意数量空格和水平制表符。 指令总是在第一个换行符处结束,除非明确地指明要延续。

1.4K00

C语言和实参区别?

实参是程序中已经分配了内存空间参数,它可以被赋予一个具体值,比如常数、数组、地址(指针),也可以是一个变量名、数组名或表达式,当然也包括指针变量。...形则是你在写一个被调函数时,为了说明用到自变量类型、要进行什么操作而定义,在调用函数前它不会被分配内存空间,更不会被赋予具体值。...调用函数时,形参会被分配一个新内存空间,实参值就会被“复制”进去,让它在被调函数中参与运算。而实参本身不参与这个运算,它仅仅起到一个传递值作用(不过在C++中可以用&改变实参值)。...如果参数形式是指针,那么“复制”就是地址。...(b)); printf("b = %d\n", b); return 0; } 输出func1 = 6, b = 5,实参b值并没有改变。

3.6K20

C语言和实参区别?

实参是程序中已经分配了内存空间参数,它可以被赋予一个具体值,比如常数、数组、地址(指针),也可以是一个变量名、数组名或表达式,当然也包括指针变量。...形则是你在写一个被调函数时,为了说明用到自变量类型、要进行什么操作而定义,在调用函数前它不会被分配内存空间,更不会被赋予具体值。...调用函数时,形参会被分配一个新内存空间,实参值就会被“复制”进去,让它在被调函数中参与运算。而实参本身不参与这个运算,它仅仅起到一个传递值作用(不过在C++中可以用&改变实参值)。...如果参数形式是指针,那么“复制”就是地址。...(b)); printf("b = %d\n", b); return 0; } 输出func1 = 6, b = 5,实参b值并没有改变。

1.7K10

C语言函数传:指针指针

这是道哥第013篇原创 前言 今天同事问了一个问题:在函数参数中传递指针指针,很常用一个场景,重新梳理一下记录于此,以后如果有类似的问题直接发这篇小总结就可以了。...执行do_work(pData, 128); 这里传递参数是pData本身,所以进入void do_work(char *p, int size)函数之后,实参pData内容就赋值给形p,所以指针...执行p = (char *)malloc(size + 1); 这句话作用是把申请到堆空间首地址,赋值给p。...当然,p指向堆空间也就泄露了。 代码:版本2 代码本意是在do_malloc函数中申请堆空间,然后把这块空间首地址赋值给pData。...我会把十多年嵌入式开发中项目实战经验进行总结、分享,相信不会让你失望

2.1K20

c语言之带参数定义

1.带参数定义中,名和新表之间不能有空格, 2.在带参数定义中,形参数不分配内存单元,因此不必作类型定义。而调用中实参有具体值,要用它去代换形,因此必须作类型说明。...2; y = 3; max = MAX(x,y); printf("%d\n", max); system("pause"); return 0; } 3.在定义中是标识符...4.在定义中,字符串内通常要用括号括起来以避免出错。 5.带和代餐函数类似,但本质不同,除此之外,把同一表达式用函数处理和用处理两者结果有可能不同。...这是因为普通函数调用时,实参传给形是值,而在定义时,要用表达式进行替换,即(i++)*(i++),所以I++会被执行两次。...6.定义也可以用来定义多个语句,在调用时,把这些语句又代换到源程序内。

2.3K20
领券