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

c语言函数的隐式声明

c语言里变量必须先声明后使用,函数也不例外,这点和js,php不一样。...double function(void){  return 100.0; } 定义一个函数第一行,声明了函数的名字,参数类型个数,返回值,这称为函数原型, 函数原型也可单独写,不带函数体 double...function(void); 编译器只有碰到函数原型的时候才知道这个函数的名字,参数类型个数返回值,到函数调用的时候才知道如何生成指令,所以函数原型必须出现在函数调用之前。...在main函数中调用function函数时并没有声明它,编译器认为此时隐士声明了int function(void);隐士声明的函数返回值都是int,由于我们调用function的时候没有传参数,所以编译器认为这个隐式函数的参数类型是...然后编译器接着往下看,看到function函数的原型是 double function(void);和先前隐式声明的类型不一致。

2.7K20

LoRaNode开发——构建keil工程

LoRaNode的SDK可能由于某种原因吧,是在linux下面开发的,我们今天来构建windows下的keil开发工程。 在SDK的基础上构建工程,只做添加,不删除SDK原生的文件。...1、在以下路径创建文件夹: ? ? 2、创建Keil工程: ? 3、保存工程在我们刚才添加的目录: ? 4、选择mcu: ? 5、项目管理以及创建文件分组: ?...6.4、往boards\mcu\STM32L1xx_HAL_Driver组添加库函数,我们只添加HAL库: ? 6.5、往boards\mcu组添加: ?...7、添加好的工程,库函数文件比较多没有展开,其他展开如下: ? 8、添加h文件路径,上面添加c文件的时候,有许多h文件,在这里添加相应h文件的路径: ?...10、添加宏以及设置编译参数: 编译选项:HAL库里面用到c99的东西,因此需要勾上C99 Mode 宏定义: STM32L152xE :使用的单片机 USE_HAL_DRIVER :使用HAL库 SX1276MB1LAS

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

    面试官:什么是宏定义和内联函数?

    题目大意问的是在C语言和C++中分别用什么来处理一段短小、反复被调用的代码。我虽然回答出来了,但其实我当时并不是特别了解内联函数,只是听过而已。今天就来稍微理一理。...内联函数是在函数前加上inline关键字,这样的函数就被声明为内联函数,inline是C++的关键字,C语言本身是不支持内联函数的,但是后来在C99标准中支持了内联函数,当然,具体在C语言中能不能用和编译器也有关系...,效果上是一样的(注意如果inline函数定义在被调用的函数之后,需要在前面声明)。...因为使用宏定义有时会产生意想不到的错误,这也是笔试题中经常考的地方。 什么错误呢?来看下面的例子,只是在上面的例子上多乘一个2....在inline里面,正确计算出了结果6,而宏里面却得到4.因为宏展开后是这样的:2*a+b 这样就出现了错误。这是很多初学者容易犯的错误,也是在面试题中的高频考点,至少在我最近的面试题中频繁出现了。

    1.5K20

    STM32自定义创建工程模板

    各文件夹、文件说明如下: Core:存放从SDK文件夹抽取的部分可能会修改的核心文件; Driver: 存放用户编写的外设驱动文件; Main: 存放主函数文件; Project: 存放Keil工程文件...“Main”为存放主函数文件目录,创建“main.c”和“main.h” ,参考“1_工程模板”的工程代码。...HAL库很多C语言语法采用C99标准,这里需要勾选上“C99 Mode”,不然会编译报错。最后点击“Include Paths”最右边的按钮 添加头文件,如图 7.1.18 所示。...在弹出的文件夹设置窗口,点击 按钮,依次添加如图 7.1.19 所示路径,最后点击“OK”。...以上全部设置完后,点击 编译,编译完后,点击 下载,出现如图 7.1.21 所示的红色下划线提示,即表示编译、烧写都正常(当前工程主函数没有任何内容,开发板无任何现象)。

    62130

    C语言和C++区别到底在哪?

    与C不兼容之处 上面说了C的大部分代码在C++上都能run的溜溜的,但是也有少数C代码会在C++中失效,或者在C++中有不同的行为。例如:隐式转换。...1).最常见的差异之一是,C允许从void*隐式转换到其它的指针类型,但C++不允许。...下列是有效的C代码: //从void*类型隐式转换为int*类型 int*i=malloc(sizeof(int)*5); 但要使其在C和C++两者皆能运作,就需要使用显式转换: int*i=(int*...)malloc(sizeof(int)*5); 2).在C中,多次声明一个全局变量虽然不可取,但不算错.在C++中,多次声明同一个全局变量会引发错误. 3).另一个常见的可移植问题是,C++定义了新关键字...在C标准(C99)中去除了一些不兼容之处,也支持了一些C++的特性,如//注解,以及在代码中混合声明。不过C99也纳入几个和C++冲突的新特性(如:可变长度数组、原生复数类型和复合逐字常数)。

    1.3K80

    lvgl最新版本在STM32上的移植使用

    lvgl简介 LittlevGL是一个免费的开源图形库,提供了创建嵌入式GUI所需的一切,具有易于使用的图形元素、漂亮的视觉效果和低内存占用。 ?...即可实现先进的图形效果 C语言编写 以最大化兼容(C++ 兼容) 模拟器 无需嵌入式硬件就可以在电脑上开始GUI设计 教程、示例、主题 从而快速GUI设计 文档 在线及离线 免费开源 基于MIT协议...6、keil工程配置 (1)导入文件 打开keil工程,在工程下新建三个组,并导入文件: ? 导入完成后得到: ?...(4)设置C99模式 lvgl需要编译器支持C99或更新的标准: ? C99模式可进行如下设置: ? (5)使能lv_conf.h的条件编译 进行上面的设置后我们首先进行编译,会报很多个错误: ?...这里我们调用一个写像素点的函数,也可以直接调用一个显示的填充方形函数。 最后,需要再头文件中声明lv_port_disp_init函数: ?

    4.2K10

    一款嵌入式平台的无线通信模组管理框架

    1 RIL(Radio Interface Layer) 简介 RIL是一款专门为嵌入式平台开发的无线通信模组(GSM/GPRS/CatM1/NB-Iot)管理软件。...目前已支持EC21、BG96、 HL8518等模组,相关的应用也在持续更新中。 基本特性 包含网络注册、连接、短信收发及Socket通信管理等基本功能。...通过简单的修改就能够适用于不同的RTOS平台。 内置多种情况下的异常处理机制,保证模组稳定运行。 内置常用组件,如带断点续传功能的HTTP文件下载、TFTP传输、MQTT等。...创建数量) RTOS及堆栈: RIL需要运行在两个任务中,每个任务的堆栈至少 256 Bytes 编译器:由于RIL使用了一些C99的特性(柔性数组、内联),所以编译器需要开启对C99的支持。...对于IAR,它默认是打开的,而Keil MDK需要手动增加编译选项(--c99 --gnu) 。 软件架构 开发指南 #include "ril.h" //....

    31310

    【STM32H7教程】第9章 STM32H7重要知识点数据类型,变量和堆栈

    是C99中引进的一个标准C库的头文件。...mod=viewthread&tid=501 9.3   局部变量和全局变量 9.3.1      局部变量 在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们...全局变量存储在静态存储区中,动态存储区可以存放以下数据:   函数形式参数,在调用函数时给形参分配存储空间。   局部变量(未加static声明的局部变量)。   函数调用时的现场保护和返回地址等。...9.3.5      用static声明局部或者全局变量 有时候希望函数中的局部变量的值在函数调用结束后不消失而保留原值,即占用的存储单元不释放,在下一次该函数调用时,该变量已有值,就是上一次函数调用结束时的值...这时可以使用关键字static进行声明。 用static声明一个变量的作用:   对局部变量用static声明,则使用该变量在整个程序执行期间不释放,为其分配的的空间始终存在。

    85660

    嵌入式界面神器 littleVGL

    1、littleVGL 介绍 littleVGL 是近几年开始流行的一个小型开源嵌入式 GUI 库,具有界面精美,消耗资源小,可移植度高,响应式布局等特点,全库采用纯 c 语言开发,而且 littleVGL...UTF-8 编码 支持多个和多种显示设备,例如同步显示在多个彩色屏或单色屏上 完全自定制的图形元素 硬件独立于任何微控制器或显示器 可以缩小到最小内存 (64 kB Flash, 16 kB RAM)...支持操作系统、外部储存和 GPU(非必须) 仅仅单个帧缓冲设备就可以呈现高级视觉特效 使用 C 编写以获得最大兼容性(兼容 C++) 支持 PC 模拟器 为加速 GUI 设计,提供教程,案例和主题,支持响应式布局...,即一个像素占 2 个字节,那么推介的显示缓冲区大小为 104802=9600 个字节 C99 或更新的编译器,如果是用 keil 开发的话,一定得勾选”c99”模式,否则编译会报错的 基本的 c(或者...c++)语言知识,如:指针,结构体,回调函数 已经支持的平台 LVGL 本身并不依赖特定的硬件平台,任何满足 LVGL 硬件配置要求的微控制器均可运行 LVGL。

    2.1K30

    走进数组的奇妙之旅(1)-学习笔记

    引言: 在前几篇文章中,我们深入探讨了函数的奥秘。在讲述函数知识的过程中,我们邂逅了一个新的概念,你或许还记得在演示 strcpy函数时,出现的这行代码:char1[20]={0};。...但是呢,并不是所有情况下都可以使用变量,比如 补充知识点: 在C99标准之前,数组的大小必须是常量或者常量表达式; 在C99之后,数组的大小可以是变量,这是为了支持变长数组; 变长数组的意思是 数组的大小是通过变量来指定的...支持C99的编译器: GCC:GNU Compiler Collection 的缩写,它在其编译器集合中提供了 C 编译器,支持 C99 标准。GCC 是一款广泛使用的开源编译器。...Keil:在 Keil 编译器中,可通过相关设置使其支持 C99(变量声明在执行语句之后)。具体操作是在“Options for Target”中的“C/C++”选项卡下,勾选“C99 Mode”。...如果我们想把数组的内容全部打印出来,那么范围该怎么确定? 范围不需要我们计算,使用sizeof函数会自动帮我们计算范围。

    8810

    重读《c primer plus》发现了99%的人都会忽略的知识点之声明和初始化

    当你的编译器不支持C99时,不能使用 long long 和 unsigned long long。...2.2 定义、声明全局变量和函数的小技巧 你需要知道:定义只能有一处,声明却可以有很多处。 为了提高程序的移植性,需要考虑到ANSI 下的编译器和连接器。...2.3 extern用法 2.3.1 extern在函数中的作用 函数的声明中带有关键字extern,仅仅是声明可能在别的源文件里定义,没有其它作用。...2.3.2 extern在变量中声明的作用 一个.c中引用其他.h声明的extern 变量,需要在此.c中对这个变量用extern声明,例如 //test1.h extern int a; 在test2...a[N]; /* 上面指针的数组 */ 2.5 函数指针的声明 返回值类型 ( * 指针变量名) ([形参列表]); 举个隐式声明函数指针的例子,并完成初始化。

    52530

    C++与C的区别终于说清楚了!

    C99标准的发布使得问题更加复杂,因为有些情况下使得C更接近C++。 例如,C99标准允许在代码中的任意处进行声明,而且可以识别//注释指示符。在其他方面,C99使其与C++的差异变大。...这部分主要讨论C99、C11和C++之间的区别。当然,C++也正在发展,因此,C和C++的异同也在不断变化。 — 01 — 函数原型 在C++中,函数原型必不可少,但是在C中是可选的。...如果const变量是外部链接,就必须在一个文件中进行定义式声明,然后在其他文件中使用关键字extern进行引用式声明。 顺带一提,C++可以使用关键字extern使一个const值具有外部链接。...];相同 */ 当然,也可以在C99中使用相同的声明,不过这样的声明会创建一个变长数组。...C更关心数值计算社区提出的需求。 — 11 — 内联函数 C99支持了C++的内联函数特性。但是,C99的实现更加灵活。在C++中,内联函数默认是内部链接。

    90010

    C语言中常见指针问题集解答

    我想声明一个指针并为它分配一些空间,但却不行。这些代码有什么问题?...char *p; *p = malloc(10); 答:你所声明的指针是p, 而不是*p, 当你操作指针本身时你只需要使用指针的名字即可:cp = malloc(10);当你操作指针指向的内存时,你才需要使用...下面这样的调用似乎不行 f(&5); 答:在 C99 中, 你可以使用 “复合常量”:f((int[]){5});在C99之前,你不能直接这样做;你必须先定义一个临时变量,然后把它的地址传给函数:...你可以自己模拟按引用传递, 定义接受指针的函数,然后在调用时使用 & 操作符。事实上,当你向函数传入数组时,编译器本质上就是在模拟按引用传递。..., 所有 “真正的” 函数名总是隐式的退化为指针。

    55940

    野火指南者开发板移植 lvgl 库

    导入 lvgl 库到 keil 工程中 首先在 keil 工程中新建 lvgl Groups 组,然后将 lvgl/src/lv_core lvgl/src/lv_draw lvgl/src/lv_font...image-20201102141620914 从序号 2 可以知道,它需要 C99 或者更新的编译器,我们这里选择 C99 进行编译, !...接下来,就需要提供 lvgl 运行的心跳节拍 lvgl 心跳节拍设置 这里采取的一个方案是通过定时器来为 lvgl 来提供心跳节拍,更为直观的叙述也就是通过定时器产生 1ms 的定时中断,然后在中断服务函数里调用...keil 的工程路径中去,添加完成之后,就可以编译了,但是使用野火的编写的 LCD 驱动编译之后会出现三个错误,如下图所示: ?...image-20201102151736551 出现该错误的原因是因为 C99 跟内联函数的一些关联,具体的细节不在这里深究了,更改方式是在三个函数前加上 static,如下图所示: ?

    2.1K20

    嵌入式c编程的一点小记录——宏

    1、通常来讲,宏就是在预编译的用于替换的,因此,如果宏里面有enum,那么预编译是不会成功的。gcc,tcc等编译器可以使用-E选项。可以输出.i 文件,查看预编译的输出文件。...keil 或者iar等嵌入式开发工具(我主要是使用者两个工具,其他免费的比如segger es,stmcubeide等肯定也可以配置输出的),就是勾勾选选的事情,就可以输出预编译文件了。...blog.csdn.net/liming0931/article/details/109702175,https://blog.csdn.net/liming0931/article/details/110393297 3、c99...https://gcc.gnu.org/onlinedocs/gcc-10.2.0/cpp/,https://gcc.gnu.org/onlinedocs/ 6、宏定义可以定义函数宏,通常情况下,也就是宏的一行不要太多代码即可...,目前c99字符数量不要超过4096就可以,可以提高编程效率,维护代码更加方便快捷。

    52820

    为什么C语言依然是必学的编程语言,这3点告诉你答案

    虽然不知道具体是如何进行排名的,但可信程度还是很高的。 再来看一组数据,近十几年 TOP 10 编程语言走势图: C语言 这里说几点: 1.Python在近两年随着人工智能火了。...:C90 ,ANSI C 标准被接纳为 ISO/IEC 9899-1990 1995: C95 (ISO/IEC 9899 AM1) 极大扩充了宽和多字节字符支持 双标符、iso646.h 1999:C99...、 isblank 、窄与宽字符串字面量的连接、枚举的尾逗号、类函数宏的空参数、 STDC_* pragma 、 va_copy 、 tmpnam 的空返回、 setvbuf 中的空指针、 printf...的 hh 与 ll 长度指定符、 snprintf 、 _Exit 、 tgmath.h 、仿 POSIX strftime 指定符 B.来自 C++ : inline 、声明与代码混合、 for 循环的...init 子句中的声明、 // 注释、源代码中的通用字符名 C.移除隐式函数声明和隐式 int 2011:C11 (ISO/IEC 9899:2011) A.具线程的内存模型 、 stdatomic.h

    96420

    CC++ 之 C发展史及 各标准特性说明

    inline(内联)关键字    内联函数除了保持结构化和函数式的定义方式外,还能使程序员写出高效率的代码。...    在C99中,如果需要使用数组作为函数变元,可以在数组声明的方括号内使用static关键字,这相当于告诉编译程序,变元所指向的数组将至少包含指定的元素个数。...分散代码与声明    解除了原先必须在block的第一条语句之前声明变量的限制:现在C99也和C++一样,可以在代码中随时声明变量了。 ...1271023函数调用中的参数个数31127 不再支持隐含式的int规则 每个声明中的声明说明符中应至少指定一个类型说明符,现在不支持没有类型就默认是int的声明语句。...比如在C89中, auto i = 0;是合法的删除了隐含式函数声明对返回值的约束。

    94900
    领券