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

C语言笔记】函数

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

1.1K40

函数和可变参数

I'm %s\n","Wanglitao"); return 0; } 的实现形式其实跟函数差不多:用 ... 表示列表,列表由不确定的参数组成,各个参数之间用逗号隔开。...可变参数使用 C99 标准新增加的一个 VA_ARGS 预定义标识符来表示前面的列表,而不是像函数一样,使用 va_list 、va_start 、 va_end 这些去解析列表。...#define LOG(fmt,args...) printf(fmt, args) 使用预定义标识符 VA_ARGS 来定义一个,是 C99 标准规定的写法。...而上面这种格式是 GNU C 扩展的一个新写法。我们不再使用 VA_ARGS ,而是直接使用 args... 来表示一个列表,然后在后面的定义中,直接使用 args 代表列表就可以了。...原生态C语言并没有这种奢侈,即便如此,Linux也定义了一个“野生”的 foreach 来实现类似的功能。

1.9K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

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

    其中DSP与FPGA通过两个带进行数据交互(DSP与FPGA通过一块共享内存来实现数据交互,我这边的DSP只要往共享内存中写入数据即为往FPGA中写数据,往共享内存中读取数据就是读取FPGA发送过来的数据...FPGA_READ(data_in, base_addr, offset) \ ((data_in) = (((volatile uint32*)base_addr)[(offset)])) 带也称做函数...关于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为什么要使用来对一些算法进行封装呢,难道使用函数来封装不可以吗?答案是可以的: ?...比如参数类型没法作为参数传递给函数,但是可以把参数类型传递给带

    3K10

    C++11 模板

    2.1.2逗号表达式展开参数包 2.2类模版 2.2.1偏特化与递归方式展开 2.2.2继承方式展开 3.模板的应用 3.1消除重复代码 3.2实现泛化的delegate 4.总结 参考文献...1.概述 模板(variadic template)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数、任意类型的参数。...2.1函数模版 一个简单的函数模板。 template void f(T... args) { cout << sizeof......,类模板的参数包展开需要通过模板特化和继承方式去展开,展开方式比函数模板要复杂。...下面看一下展开类模板中的参数包的方法。 2.2.1偏特化与递归方式展开 类模板的展开一般需要定义两到三个类,包括类声明和偏特化的类模板。

    3.3K51

    C语言定义

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

    32510

    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.2K30

    C语言定义用法

    在上篇文章里面,我们分析了预处理的一个完整过程,这能够让我们理解一个写好的程序,在生成一个可执行文件,到底发生了什么,对我们在大型工程项目里面有助于对程序的理解;今天我们继续接着上篇文章的基础上,来分享有关c语言里面关于定义的用法...在C语言中,“”分为两种:无参数 和 有参数(这里有参数先不举例子,下面具体分析的话,读者可以详细看到示例来理解这个)。...(2)带和带函数的一个重要差别就是:定义不会检查参数的类型,返回值也不会附带类型;而函数有明确的参数类型和返回值类型。...总的来说,如果代码比较多用函数适合而且不影响效率;但是对于那些只有一两句话的函数开销就太大了,适合用带。但是用带又有缺点:不检查参数类型。 缺点: 由于是直接嵌入的,所以代码可能相对多一点。...对带而言,由于是直接替换,并不会检查参数是否合法,存在安全隐患。

    2.7K60

    C语言中的定义

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

    6.4K10

    C语言有参数定义与无参数定义

    前两天上课,被JAVA老师问懵了,老师问:“你们学C语言,有没有写过带玩一玩”,说实话,我根本没听过什么带,我只用过定义,所以我下来一定要找个时间把这“带搞懂”,于是就有了这篇文章...C语言定义分两种,无和有 1.无参数的        无参数定义的一般形式为: #define name value//name是你起的名字,就跟起函数名一样,value是你要给这个名字赋予什么值...=t; int swap2(int c,int d) {         int t;         t = c;         c = d;         d = t; } int main()...{     int a,b,c,d,t;     a = 5;     b = 3;     c = 5;     d = 3;     swap1(a,b);         swap2(c,d);...下面给出带和函数的区别:        1. 会在编译器在对源代码进行编译的时候进行简单替换,不会进行任何逻辑检测,即简单代码复制而已。        2.

    2.8K30

    【编程基础】C语言常见定义

    我们在使用C语言编写程序的时候,常常会使用到定义以及编译指令,有的可能比较常用,有的可能并不是很常用,是不是所有的C语言定义以及指令你都清楚呢?...指令 用途 # 空指令,无任何效果 #include 包含另外一个文件 #define 定义 #undef...取消已定义的 #if 如果给定条件为真,则编译下面代码 #ifdef 如果已经定义,则编译下面代码 #ifndef...#运算符 出现在定义中的#运算符把跟在其后的参数转换成一个字符串。 ##运算符 用于把参数连接到一起。预处理程序把出现在##两侧的参数合并成一个符号。...FILE__ 包含当前程序文件名的字符串 __LINE__ 表示当前行号的整数 __DATE__ 包含当前日期的字符串 __STDC__ 如果编译器遵循ANSI C标准

    2K80
    领券