首页 > 其他分享 >2024-02-17-物联网C语言(4-预处理)

2024-02-17-物联网C语言(4-预处理)

时间:2024-02-17 15:56:17浏览次数:36  
标签:02 头文件 17 代码段 C语言 编译 include hello define

4.预处理

4.1 c语言的编译过程

gcc -E hello.c -o hello.i  # 1.预编译
gcc -S hello.i -o hello.s  # 2. 编译
gcc -c hello.s -o hello.o  # 3. 汇编
gcc hello.o -o hello_elf   # 4. 链接
  1. 预编译

    .c中的头文件展开、宏展开

  2. 编译

    将预处理之后的.i文件生成.s汇编文件

  3. 汇编

    .s汇编文件生成.o目标文件

  4. 链接

    .o文件链接成目标文件

4.2 include

#include <> // 用尖括号包含头文件,在系统指定的目录下找头文件
#include "" // 用双引号包含头文件,在当前目录下找头文件;如果找不到,再到系统目录下找,一般自定义函数使用

注意:

  1. include也可以用来包含.c文件,但是不建议。因为这样会导致.c文件在预编译阶段被展开,如果一个.c被多次展开,会导致重复定义,所以不建议包含.c文件。
  2. 预处理只是对include等预处理操作进行处理,不会进行语法检查,所以这一阶段即便代码有语法错误也不会报错。

4.3 define

定义宏用define,宏是在预编译的时候进行替换

  1. 不带参宏

    #define PI 3.1415926
    

    注意:宏定义后边不用加分号

  2. 带参宏

    #define S(a,b) (a)*(b)
    
    #include <stdio.h>
    #define PI 3.1415926
    #define S(a,b) a*b
    
    int main(){
        printf("PI = %lf\n",PI);
        printf("a * b = %d",S(2,4));
    }
    

    输出结果

    PI = 3.141593
    a * b = 8
    

    带参宏与带参函数

    1. 带参宏被调用多少次就会展开多少次,执行代码的时候没有函数调用的过程,不需要压栈弹栈,这是一种空间换时间的做法。

      带参函数,调用的时候需要压栈弹栈,浪费了时间,节省了空间。

    2. 带参函数的形参是有类型的,带参宏的形参是没有类型名的。

    3. 功能简单,不需要太多空间,可选用带参宏;大多数情况下还是选择带参函数

4.4 选择性编译

  1. 第一种形式

    // 如果当前的.c 中定义过AAA,就会编译代码段1,否则编译 代码段2
    #ifdef AAA
        代码段1
    #else
        代码段2
    #endif
    
  2. 第二种形式

    // 该形式与第一种形式形成互补,这种方法可以防止头文件重复包含
    #ifndef AAA
    	代码段1
    #else
        代码段2
    #endif
    
  3. 第三种形式

    // 如果表达式为真,执行代码段1,否则执行代码段2
    #if 表达式
    	代码段1
    #else
        代码段2
    #endif
    

    选择性编译都是预编译阶段干的事情

标签:02,头文件,17,代码段,C语言,编译,include,hello,define
From: https://www.cnblogs.com/hasaki-yasuo/p/18018044

相关文章

  • IDEA 2024.1:Spring支持增强、GitHub Action支持增强、更新HTTP Client等
    有段时间没有更新IDEA了,早上看到IntelliJIDEA2024.1EAP5发布的邮件提示,瞄了一眼,发现真的是越来越强了,其中不少功能对我来说还是非常有用的。也许这些能力对关注DD的小伙伴也有帮助,所以搞篇博客介绍和推荐一下。Spring、Quarkus等主流框架的支持增强SearchEverywhere功能......
  • AI 改造计划进度汇报 2402
    AI已经大大提升了我的效率,正好这几天放假没事干,总结出这篇汇报。AI+技术自媒体首先是AI+开发和文创的所有路都自动化了。技术文章的翻译已经过半,不出两个月,我就能把我见到的所有技术文章都翻译一遍。然后我觉得AI不应当只能完成翻译,技术自媒体应该也有点别的花样。第一个能......
  • 2023.2.17 LGJ Round
    A一个字符串,你要选最多的区间出来,满足两两不交,且右边的区间必须是左边区间的严格子串。\(n\le5e5\).注意到答案是\(\sqrtn\)级别的。那么我们设计一个dp,设\(f_{i,j}\)表示\([j,j+i-1]\)这个区间以及右边是否能选出\(i\)个。转移只需要检查大区间减去左端点/右端点......
  • P9325 [CCC 2023 S2] Symmetric Mountains
    原题链接题解,请看题解区————能不能利用已经算过的值来减少后续计算量呢?如果你toolongonline2:n为一的时候只输出零code#include<bits/stdc++.h>usingnamespacestd;inta[5005]={0};intf[5005][5005]={0};intmain(){intn;cin>>n;for(inti=1......
  • 2024寒假集训纪要 & 闲话 (下半)
    2.16本来说要写\(4\)道多项式的题的,到最后算上\(\text{AC}\)自动机之类的也没\(4\)道题\(\color{white}{唔,我好想补完春节期间在家看的『约会大作战(第三部)』啊,但是我没有【数据删除】所以看不了诶}\)明天似乎有模拟赛?寄寄寄寄寄寄寄寄寄寄搞了个题单,但是看起来意义不......
  • P8784 [蓝桥杯 2022 省 B] 积木画
    原题链接太妙了,请移步题解区,有用数学归纳法做的,也有用找规律做的L型积木一定是成对出现的code#include<bits/stdc++.h>usingnamespacestd;constintmod=1e9+7;longlongdp[10000005]={0};intmain(){intn;cin>>n;dp[0]=1;dp[1]=1;dp[2]=2;......
  • 2024-02-17 有一个观点有松动了,没房没车没存款,配不配
       2024-02-17     好像挺根深蒂固的,没房没车没存款,都没有资格结婚恋爱,在女人面前也很自卑。   直到我叔和婶娘,跟我说,这个不讲配不配得上,而是讲缘分的。举了现实的例子,富家女嫁穷小伙的,帮穷小伙买车买房。   还有一些外省嫁过来的。还有我们家,几个叔......
  • [MRCTF2020]Easy_RSA
    [MRCTF2020]Easy_RSA首先,RSA计算的5个基本公式n=pqφ(n)=(p-1)(q-1)求φ(n)e*dmodφ(n)=1求ed其中之一c=m^emodn加密m=c^dmodn解密题目:importsympyfromgmpy2importgcd,invertfromrandomimportrandintfromCrypto.Util.numberimportgetPrime,is......
  • 2024-02-17-物联网C语言(3-函数)
    3.函数3.1函数的概念函数是c语言的功能单位,实现一个功能可以封装一个函数实现。定义一个函数的时候需要一切以功能为目的,根据功能去定义函数的参数和返回值。3.2函数的分类3.2.1从定义角度分类库函数(c库实现)自定义函数(程序员自定义函数)系统调用(操作系统实现的函数)3.......
  • 2024 寒假做题总结
    P2146[NOI2015]软件包管理器思路分析树链剖分板子,每次安装时,将\(1\)到\(x\)的链变为\(1\),卸载时,将\(x\)的子树变为\(0\)。代码#include<iostream>usingnamespacestd;inlineintread(){registerintx=0,f=1;registercharc=getchar();while(c<'0'......