C语言的预处理

C语言之编译预处理 编译预处理是指在c编译程序对c源程序进行编译之前,对预处理命令进行“预先“处理的过程。编译预处理是通过编译预处理程序实现的。 预处理命令不是c语言的组成部分,c语言的编译程序无法识别他们。 比如#include<stdio.h>就是一个预处理命令,其功能是在将源程序编译成目标程序之前,将文件“stdio.h“中的内容替换该命令,然后由编译程序将源程序翻译成目标程序。 C语言中的预编译处理命令主要有以下3种:宏定义、文件包含、条件编译 为了与一般的c语句相区分,编译预处理命令必须以#为 阅读详情
目录
 
一.预处理的工作方式... 3
1.1.预处理的功能... 3
1.2预处理的工作方式... 3
二.预处理指令... 4
2.1.预处理指令... 4
2.2.指令规则... 4
三.宏定义命令----#define. 4
3.1.无参数的宏... 4
3.2带参数的宏... 5
3.3.预处理操作符#和##. 6
3.3.1.操作符#. 6
3.3.2.操作符##. 6
四.文件包含------include. 6
五.条件编译... 7
5.1使用#if 7
5.2使用#ifdef和#ifndef 9
5.3使用#defined和#undef 10
六.其他预处理命令... 11
6.1.预定义的宏名... 11
6.2.重置行号和文件名命令------------#line. 11
6.3.修改编译器设置命令 ------------#pragma. 12
6.4.产生错误信息命令 ------------#error 12
七.内联函数... 13
 在嵌入式系统编程中不管是内核的驱动程序还是应用程序的编写,涉及到大量的预处理与条件编译,这样做的好处主要体现在代码的移植性强以及代码的修改方便等方面。因此引入了预处理与条件编译的概念。在C语言的程序中可包括各种以符号#开头的编译指令,这些指令称为预处理命令。预处理命令属于C语言编译器,而不是C语言的组成部分。通过预处理命令可扩展C语言程序设计的环境。
一.预处理的工作方式
 1.1.预处理的功能
 在集成开发环境中,编译,链接是同时完成的。其实,C语言编译器在对源代码编译之前,还需要进一步的处理:预编译。预编译的主要作用如下:
●将源文件中以”include”格式包含的文件复制到编译的源文件中。
●用实际值替换用“#define”定义的字符串。
●根据“#if”后面的条件决定需要编译的代码。
 1.2预处理的工作方式
 预处理的行为是由指令控制的。这些指令是由#字符开头的一些命令。
#define指令定义了一个宏---用来代表其他东西的一个命令,通常是某一个类型的常量。预处理会通过将宏的名字和它的定义存储在一起来响应#define指令。当这个宏在后面的程序中使用到时,预处理器”扩展”了宏,将宏替换为它所定义的值。
#include指令告诉预处理器打开一个特定的文件,将它的内容作为正在编译的文件的一部分“包含”进来。例如:下面这行命令:
#include<stdio.h>
指示预处理器打开一个名字为stdio.h的文件,并将它的内容加到当前的程序中。预处理器的输入是一个C语言程序,程序可能包含指令。预处理器会执行这些指令,并在处理过程中删除这些指令。预处理器的输出是另外一个程序:原程序的一个编辑后的版本,不再包含指令。预处理器的输出被直接交给编译器,编译器检查程序是否有错误,并经程序翻译为目标代码。
 二.预处理指令
 2.1.预处理指令
 大多数预处理器指令属于下面3种类型:
●宏定义:#define 指令定义一个宏,#undef指令删除一个宏定义。
●文件包含:#include指令导致一个指定文件的内容被包含到程序中。
●条件编译:#if,#ifdef,#ifndef,#elif,#else和#dendif指令可以根据编译器可以测试的条件来将一段文本包含到程序中或排除在程序之外。剩下的#error,#line和#pragma指令更特殊的指令,较少用到。
 2.2.指令规则
 ●指令都是以#开始。#符号不需要在一行的行首,只要她之前有空白字符就行。在#后是指令名,接着是指令所需要的其他信息。
●在指令的符号之间可以插入任意数量的空格或横向制表符。
●指令总是第一个换行符处结束,除非明确地指明要继续。
●指令可以出现在程序中德任何地方。我们通常将#define和#include指令放在文件的开始,其他指令则放在后面,甚至在函数定义的中间。
●注释可以与指令放在同一行。
 三.宏定义命令----#define   
使用#define命令并不是真正的定义符号常量,而是定义一个可以替换的宏。被定义为宏的标示符称为“宏名”。在编译预处理过程时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。在C语言中,宏分为有参数和无参数两种。
 3.1.无参数的宏
    其定义格式如下:
#define 宏名  字符串
在以上宏定义语句中,各部分的含义如下:
● #:表示这是一条预处理命令(凡是以“#”开始的均为预处理命令)。
●define:关键字“define”为宏定义命令。
●宏名:是一个标示符,必须符合C语言标示符的规定,一般以大写字母标示宏名。
●字符串:可以是常数,表达式,格式串等。在前面使用的符号常量的定义就是一个无参数宏定义。
Notice:
预处理命令语句后面一般不会添加分号,如果在#define最后有分号,在宏替换时分号也将替换到源代码中去。在宏名和字符串之间可以有任意个空格。
Eg:#define PI 3.14
在使用宏定义时,还需要注意以下几点:
●宏定义是宏名来表示一个字符串,在宏展开时又以该字符串取代宏名。这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。
●宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。
●宏名在源程序只能够若用引号括起来,则预处理程序不对其作宏替换。
●宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序层层替换。
●习惯上宏名可用大写字母表示,以方便与变量区别。但也允许用小写字母。
 3.2带参数的宏
 #define命令定义宏时,还可以为宏设置参数。与函数中的参数类似,在宏定于中的参数为形式参数,在宏调用中的参数称为实际参数。对带参数的宏,在调用中,不仅要宏展开,还要用实参去代换形参。
带参宏定义的一般形式为:
#define 宏名(形参表)  字符串
在定义带参数的宏时,宏名和形参表之间不能有空格出现,否则,就将宏定义成为无参数形式,而导致程序出错。
Eg:#define ABS(x) (x)<0?-(x):(x)
 以上的宏定义中,如果x的值小于0,则使用一元运算符(-)对其取负,得到正数。带参的宏和带参的函数相似,但其本质是不同的。使用带参宏时,在预处理时将程序源代码替换到相应的位置,编译时得到完整的目标代码,而不进行函数调用,因此程序执行效率要高些。而函数调用只需要编译一次函数,代码量较少,一般情况下,对于简单的功能,可使用宏替换的形式来使用。
 3.3.预处理操作符#和##
 3.3.1.操作符#
  在使用#define定义宏时,可使用操作符#在字符串中输出实参。Eg:#define AREA(x,y) printf(“长为“#x”,宽为“#y”的长方形的面积:%d\n”,(x)*(y));
3.3.2.操作符##
 与操作符#类似,操作符##也可用在带参宏中替换部分内容。该操作符将宏中的两个部分连接成一个内容。例如,定义如下宏:
#define VAR(n)   v##n
当使用一下方式引用宏:
VAR(1)
预处理时,将得到以下形式:
V1
如果使用以下宏定义:
#define FUNC(n)  oper##n
当实参为1时,预处理后得到一下形式:
oper1
 四.文件包含------include
 
     当一个C语言程序由多个文件模块组成时,主模块中一般包含main函数和一


些当前程序专用的函数。程序从main函数开始执行,在执行过程中,可调用当前


文件中的函数,也可调用其他文件模块中的函数。
    如果在模块中要调用其他文件模块中的函数,首先必须在主模块中声明该函


数原型。一般都是采用文件包含的方法,包含其他文件模块的头文件。
文件包含中指定的文件名即可以用引号括起来,也可以用尖括号括起来,格式如


下:
#include< 文件名>
或
#include“文件名”
如果使用尖括号<>括起文件名,则编译程序将到C语言开发环境中设置好的 


include文件中去找指定的文件。
因为C语言的标准头文件都存放在include文件夹中,所以一般对标准头文件采用


尖括号;对编程自己编写的文件,则使用双引号。如果自己编写的文件不是存放


在当前工作文件夹,可以在#include命令后面加在路径。
 #include命令的作用是把指定的文件模块内容插入到#include所在的位置,当


程序编译链接时,系统会把所有#include指定的文件链接生成可执行代码。文件


包含必须以#开头,表示这是编译预处理命令,行尾不能用分号结束。
  #include所包含的文件,其扩展名可以是“.c”,表示包含普通C语言源程序。


也可以是 “.h”,表示C语言程序的头文件。C语言系统中大量的定义与声明是以


头文件形式提供的。
通过#define包含进来的文件模块中还可以再包含其他文件,这种用法称为嵌套


包含。嵌套的层数与具体C语言系统有关,但是一般可以嵌套8层以上。
 


五.条件编译
 
预处理器还提供了条件编译功能。在预处理时,按照不同的条件去编译程序的不


同部分,从而得到不同的目标代码。使用条件编译,可方便地处理程序的调试版


本和正式版本,也可使用条件编译使程序的移植更方便。
5.1使用#if
与C语言的条件分支语句类似,在预处理时,也可以使用分支,根据不同的情况


编译不同的源代码段。
#if 的使用格式如下:
#if 常量表达式
   程序段
#else
  程序段
#endif
该条件编译命令的执行过程为:若常量表达式的值为真(非0),则对程序段1进行


编译,否则对程序段2进行编译。因此可以使程序在不同条件下完成不同的功能


。
Eg:
#define DEBUG 1
 
int main()
{
   int i,j;
   char ch[26];
  
   for(i='a';j=0;i<='z';i++,j++)
   {
       ch[j]=i;
       #if DEBUG
          printf("ch[%d]=%c\n",j,ch[j]);
       #endif
   }
   for(j=0;j<26;j++)
   {
       printf("%c",ch[j]);
   }
   return 0;
}
#if预编译命令还可使用多分支语句格式,具体格式如下:
#if 常量表达式 1
    程序段 1
#elif 常量表达式 2
    程序段 2
… …
#elif 常量表达式 n
    程序段 n
#else
    程序段 m
#endif
 
关键字#elif与多分支if语句中的else if类似。
Eg:
#define os win
#if os=win
    #include"win.h"
#elif os=linux
    #include"linux.h"
#elif os=mac
    #include"mac.h"
#endif
 
#if和#elif还可以进行嵌套,C89标准中,嵌套深度可以到达8层,而C99允许嵌


套达到63层。在嵌套时,每个#endif,#else或#elif与最近的#if或#elif配对


。
Eg:
#define MAX 100
#define OLD -1
 
int main()
{
int i;
#if MAX>50
{  
    #if OLD>3
    {
        i=1;
    {
    #elif OLD>0
    {
        i=2;
    }
    #else
    {
        i=3;
    }
    #endif
}
#else
{
    #if OLD>3
    {
        i=4;
    }
    #elif OLD>4
    {
        i=5;
    }
    #else
    {
        i=6;
    }
    #endif
}
#endif
return 0;
}
 


5.2使用#ifdef和#ifndef
 
在上面的#if条件编译命令中,需要判断符号常量定义的具体值。在很多情况下


,其实不需要判断符号常量的值,只需要判断是否定义了该符号常量。这时,可


不使用#if命令,而使用另外一个预编译命令———#ifdef.
#ifdef命令的使用格式如下:
#ifdef 标识符
程序段 1
#else
    程序段 2
#endif
其意义是,如果#ifdef后面的标识符已被定义过,则对“程序段1”进行编译;


如果没有定义标识符,则编译“程序段2”。一般不使用#else及后面的“程序2


”。
而#ifndef的意义与#ifdef相反,其格式如下:
#ifndef 标识符
    程序段 1
#else
    程序段 2
#endif
其意义是:如果未定义标识符,则编译“程序段1”;否则编译“程序段2”。
 


5.3使用#defined和#undef
 
与#ifdef类似的,可以在#if命令中使用define来判断是否已定义指定的标识符


。例如:
#if defined 标识符
程序段 1  
#endif
与下面的标示方式意义相同。
#ifdef 标识符
    程序段 1
#endif
也可使用逻辑运算符,对defined取反。例如:
#if ! define 标识符
    程序段 1
#endif
与下面的标示方式意义相同。
#ifndef 标识符
    程序段 1
#endif
在#ifdef和#ifndef命令后面的标识符是使用#define进行定义的。在程序中,还


可以使用#undef取消对标识符的定义,其形式为:
#undef 标识符
Eg:
#define MAX 100
……
#undef MAX
在以上代码中,首先使用#define定义标识符MAX,经过一段程序代码后,又可以


使用#undef取消已定义的标识符。使用#undef命令后,再使用#ifdef max,将不


会编译后的源代码,因为此时标识符MAX已经被取消定义了。
 


六.其他预处理命令
 
 6.1.预定义的宏名
 
       ANSI C标准预定义了五个宏名,每个宏名的前后均有两个下画线,避免


与程序员定义相同的宏名(一般都不会定义前后有两个下划线的宏)。这5个宏名


如下:
●  __DATE__:当前源程序的创建日期。
●  __FILE__:当前源程序的文件名称(包括盘符和路径)。
●  __LINE__:当前被编译代码的行号。
●  __STDC__:返回编译器是否位标准C,若其值为1表示符合标准C,否则不是标


准C.
● __TIME__:当前源程序的创建时间。
Eg:
#include<stdio.h>
 
int main()
{
   int j;
   printf("日期:%s\n",__DATE__);
   printf("时间:%s\n",__TIME__};
   printf("文件名:%s\n",__FILE__);
   printf("这是第%d行代码\n",__LINE__);
   printf("本编译器%s标准C\n",(__STD__)?"符合":"不符合");
   return 0;
}
 


6.2.重置行号和文件名命令------------#line
 
使用__LINE__预定义宏名赈灾编译的程序行号。使用#line命令可改变预定义宏


__LINE__与__FILE__的内容,该命令的基本形如下:
 #line number[“filename”]
其中的数字为一个正整数,可选的文件名为有效文件标识符。行号为源代码中当


前行号,文件名为源文件的名字。命令为#line主要用于调试以及其他特殊应用


。
Eg:
1:#include<stdio.h>
2:#include<stdlib.h>
 
4:#line 1000
 
6:int main()
7:{
8:    printf("当前行号:%d\n",__LINE__);
9:    return 0;
10:}
在以上程序中,在第4行中使用#line定义的行号为从1000开始(不包括#line这行


)。所以第5行的编号将为1000,第6行为1001,第7行为1002,第8行为1003.
 


6.3.修改编译器设置命令 ------------#pragma
 
#pragma命令的作用是设定编译器的状态,或者指示编译器完全一些特定的动作


。#pragma命令对每个编译器给出了一个方法,在保持与C语言完全兼容的情况下


,给出主机或者操作系统专有的特征。其格式一般为:
#pragma Para
其中,Para为参数,可使用的参数很多,下面列出常用的参数:
Message参数,该参数能够在编译信息输出窗口中输出对应的信息,这对于源代


码信息的控制是非常重要的,其使用方法是:
#pragma message(消息文本)
当编译器遇到这条指令时,就在编译输出窗口中将消息文本显示出来。
另外一个使用比较多得pragma参数是code_seg.格式如:
#pragma code_seg([“section_name”[,section_class]])
它能够设置程序中函数代码存放的代码段,在开发驱动程序的时候就会使用到它


。
参数once,可保证头文件被编译一次,其格式为:
#pragma once
只要在头文件的最开始加入这条指令就能够保证头文件被编译一次。
 


6.4.产生错误信息命令 ------------#error
 
#error命令强制编译器停止编译,并输出一个错误信息,主要用于程序调试。其


使用如下:
#error 信息错误
注意,错误信息不用双括号括起来。当遇到#error命令时,错误信息将显示出来


。
例如,以下编译预处理器命令判断预定义宏__STDC__,如果其值不为1,则显示一


个错误信息,提示程序员该编译器不支持ANSI C标准。
#if __STDC__!=1
   #error NOT ANSI C
    #endif
 


七.内联函数
 
在使用#define定义带参数宏时,在调用函数时,一般需要增加系统的开销,如


参数传递,跳转控制,返回结果等额外操作需要系统内存和执行时间。而使用带


参数宏时,通过宏替换可再编译前将函数代码展开导源代码中,使编译后的目标


文件含有多段重复的代码。这样做,会增加程序的代码量,都可以减少执行时间


。
在C99标准钟,还提供另外一种解决方法:使用内联函数。
在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数


体来进行替代。显然,这种做法不会产生转去转回得问题。都是由于在编译时将


函数体中的代码被替代到程序中,因此会增加目标代码量,进而增加空间的开销


,而在时间开销上不像函数调用时那么大,可见它是以增加目标代码为代码来换


取时间的节省。
定义内联函数的方法很简单,只要在定义函数头的前面加上关键字inline即可。


内联函数的定义与一般函数一样。例如,定于一个两个整数相加的函数:
#include<stdio.h>
#include<stdlib.h>
 
inline int add(int x,int y);
 
inline int add(int x,int y)
{
   return x+y;
}
 
int main()
{
   int i,j,k;
   printf("请输入两个整数的值:\n");
   scanf("%d %d",&i,&j);
   k=add(i,j);
   printf("k=%d\n",k);
   return 0;
}
在程序中,调用函数add时,该函数在编译时会将以上代码复制过来,而不是像


一般函数那样是运行时被调用。
内联函数具有一般函数的特性,它与一般函数所不同之处在于函数调用的处理。


一般函数进行调用时,要讲程序执行权转导被调函数中,然后再返回到调用到它


的函数中;而内联函数在调用时,是将调用表达式用内联函数体来替换。在使用


内联函数时,应该注意如下几点:
●    在内联函数内部允许用循环语句和开关语句。
●    内联函数的定义必须出现在内联函数第一次被调用之前。
其实,在程序中声明一个函数为内联时,编译以后这个函数不一定是内联的,
即程序只是建议编译器使用内联函数,但是编译器会根据函数情况决定是否使用


内联,所以如果编写的内联函数中出现循环或者开关语句,程序也不会提示出错


,但那个函数已经不是内联函数了。
    一般都是讲一个小型函数作为内联函数。
C语言——预处理指令 return 0;这里是可以编译通过的,运行结果也是对的:;;return 0;这里编译器会报错:这里是有语法错误的。在C语言中,#include是一个预处理指令,用于将一个源文件的内容插入到另一个源文件中。这通常用于包含标准库或自定义库的头文件,以便在程序中使用这些库中定义的函数、类型和宏。#include或:用于包含标准库头文件。查找策略是,编译器会在标准库头文件目录中查找这些文件。:用于包含用户自定义的头文件。 阅读详情

相关推荐

c语言中预处理什么作用,C语言中的三种预处理功能

C语言中的三种预处理功能导语:预处理指令是以#号开头的代码行。#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。下面是C语言三种预处理功能,欢迎阅读:指令 用途# 空指令,无任何效果#include 包含一个源代码文件#define 定义宏#undef 取消已定...

weixin_30467625的博客 2287

C语言编译预处理

C语言由源代码生成可执行程序的过程如下: C源程序->编译预处理->编译->优化程序->汇编程序->链接程序->可执行文件 其中编译预处理阶段,读取C源程序,对其中的预处理指令(以#开头的指令)和特殊符号进行处理。或者说是扫描源代码,对其进行初步的转换,产生新的源代码提供给编译器。 ...

C语言技术网-码农有道 3321

【C语言】编译预处理

本文主要介绍了C/C++预处理阶段的相关内容。预处理阶段处理以#开头的指令,包括宏定义、条件编译和头文件包含等操作。文章详细讲解了#define定义常量和宏的方法,分析了宏替换规则及其与函数的区别,并指出宏可能带来的副作用问题。同时介绍了#和##运算符的特殊用法,以及条件编译指令的多种形式。最后,文章阐述了头文件的两种包含方式及其查找策略,并提出了通过条件编译避免头文件重复包含的解决方案。

wangchen_0的博客 1513

c/c++编译预处理

(1)#include (2)#include"头文件名称" 第一种形式一般用来包含开发环境提供的库头文件,它指示编译预处理器 在开发环境中设定的路径中找所需的头文件。 第二种形式一般用来包含自己写的头文件,它指示编译预处理器在当前工 作目录中搜索头文件,如果找不到再到开发环境所设定的路径中找 .#include是一个伪指令 内部包含卫哨和外部包含卫哨 为了避免同一个编译单元包含同

月已满西楼的博客 823

C语言的编译预处理

C语言的编译预处理命令主要包括:宏定义、文件包含和条件编译。预处理命令均以“#”开始,命令的结尾没有分号,每条预处理命令必须占用单独一行。 1.宏定义 (1) 无参宏定义 无参宏定义的一般形式如下: #define 宏名 字符序列 如果源程序中使用了宏定义,编译预处理过程中,自动把源程序中出现的所有“宏名”替换为“字符序列”,这是一个纯文本替换,也称为宏替换。 例如下面定义了3个无参宏名: #de...

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1229

PCIe 物理层(Physical Layer)详解

PCIe物理层关键技术解析 PCIe物理层作为协议栈底层核心,承担着比特流传输、链路训练与电气特性管理等关键功能。该层采用分层架构,包含逻辑物理层(负责编解码/加扰)和电气物理层(处理信号收发)。关键技术亮点包括: 智能链路管理:通过LTSSM状态机实现11种状态转换,涵盖链路检测(Detect)、协商(Polling/Configuration)、功耗管理(L0s/L1)等全生命周期控制 高效编码方案:Gen1/Gen2采用8b/10b编码(20%开销),Gen3+升级为128b/130b(仅1.5%开销

珂珂可爱多 729

c语言中的编译预处理命令

注意: 1. 所有编译预处理语句以”#“开头 2. 每个预处理命令必须单独占一行 3. 语句末尾不使用分号作为结束符 4. 预处理语句主要有宏,条件编译和文件包含 1.无参宏 定义语句的格式如下: #define 标识符 字符串 **作用:**用一个简单的名称代替一个长的字符串。 标识符 称为”宏名“ 在编译时将宏名替换成字符串的过程称为”宏展开“或宏替换 作用范围:定义之后,直到本文件末尾,但...

qq_43700217的博客 2221

Qwen2.5-Omni实战:5分钟搞定多模态AI模型本地部署(含Thinker-Talker架构解析)

本文详细介绍了Qwen2.5-Omni多模态AI模型的本地部署流程,包括硬件配置、环境准备和实战应用开发。特别解析了其创新的Thinker-Talker架构,该架构通过TMRoPE位置编码实现跨模态同步处理,大幅提升多模态任务效率。5分钟即可完成部署,适合开发者快速实现文本、图像和音频的联合处理。

weixin_29085865的博客 172

C语言的预处理命令

预处理是C语言的一个重要功能,由预处理程序完成。当对一个源文件进行编译时,系统将自动调用预处理程序对源程序中的预处理部分作处理,之后自动进入对源程序的编译

qq_47896523的博客 7989

安卓ai自动化脚本 Yyds.Auto实现 示例 纯ai图像识别自动点击脚本

纯ai识别实现自动化脚本

专注安卓前沿科技 4783

图腾柱无桥PFC控制逻辑解析:从双闭环到电压前馈的设计演进

本文深入解析图腾柱无桥PFC控制逻辑的设计演进,从经典双闭环控制到电压前馈技术的实现。通过分析功率波动问题和动态响应慢的症结,提出引入电压前馈的解决方案,并详细探讨数字实现中的关键注意事项。文章还涵盖控制框图的构建、稳定性分析方法及实际应用中的调参技巧,为开关电源设计提供实用指导。

weixin_29268267的博客 572

【C语言】预处理详解

C语言预处理机制详解 本文全面介绍了C语言预处理阶段的关键概念和实用技巧,主要内容包括: 预定义符号:介绍了C语言内置的__FILE__、__LINE__等预定义符号及其用法 #define定义常量:讲解了基本语法和使用注意事项,通过预处理阶段代码替换实例展示原理 宏定义:详细解析了带参数宏的定义方法,重点强调括号使用对运算优先级的影响 副作用问题:通过实例演示宏参数带副作用时可能产生的意外结果 替换规则:系统阐述了宏替换的三个关键步骤:参数预扫描、参数替换和宏体展开 与函数对比:从执行效率、类型通用性、调

suxi_na的博客 1414

手把手教你用闲置安卓手机搭建个人收款系统(蓝鲸支付私有化部署实战)

本文详细介绍了如何利用闲置安卓手机搭建个人收款系统,实现私有化支付部署。通过开源技术栈和容器化方案,零成本构建安全、高效的支付网关,解决传统支付平台的数据安全和资金风险问题。特别适合个人开发者和小微企业主,无需复杂审批,资金实时到账,显著降低运营成本。

weixin_30363285的博客 381

C语言预处理

一.预定义符号 二.#define 1.#define定义的标识符常量 2.#define定义宏 3.#define替换规则 4.#和## 5.带副作用的宏参数 6.宏和函数的比较 7.命名约定 三.#undef 四.命令行定义 五.条件编译 1.#if defined(#ifdef) 2.#if !defined(#ifndef) 3.#if 4.嵌套指令 六.文件包含 七.其它预处理指令...

qq_61872165的博客 3419

【漏洞复现】Palo Alto Networks PAN-OS GlobalProtect 命令注入漏洞 CVE-2024-3400

在特定PAN-OS版本和不同功能配置下,未经身份验证的攻击者可能利用此漏洞在防火墙上以root权限执行任意代码。技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。本文所提供的工具仅用于学习,禁止用于其他!poc如下,注入点在Cookie中,将其中的DNSlog地址替换为你的dnslog地址,借助DNSLOG来复现,可以使用http://dnslog.pw/

失心少年 1226

智能车图像处理9-进阶篇1--中线的提取

(1)10-50行 基础扫线 (2)56-71 断行0 ,就是比如遇到十字,十字路口下方 第一次断线的地方。 (3)83-124 按照原先有效行,拟线作为中值,然后从中值向左右扫线,同时计算赛道宽度。 (4)125-138 如果出现赛道宽度小于先前有效行,则找到二次扫线的起点,从二次扫线起点处,继续向下扫线,直至结束,同时记录最后的有效行。 (5) 310-- 最后计算左右边线类似于方差的值,用于环岛的判断 ***这里着重描述一下二次扫线,希望大家可以理解的深刻

taiyuezyh的博客 1万+

【C语言】预处理

1. 从源文件到可执行文件的过程 2. 预处理指令 3. 宏定义 4. 文件包含 5. 条件编译

Qiuhan_909的博客 2998

STM32实现等精度测频

上一章介绍了利用STM32的TIM的捕获功能实现频率测量的方法,但测量误差受被测信号频率的影响,不适合测量频率变化较大的。本章将介绍等精度测频的方法以及STM32的实现。STM3...

zhang062061的专栏 3457

C语言的预处理详解

说到预处理,大家绝对不会觉得陌生。因为我们在开始编写一份程序的时候,从键盘录入的第一句话: #include &lt;stdio.h&gt; 这里就使用了预处理,引入头文件。同时在文件开头我们常见的#define ,#ifdef,#pragma之类的都属于预处理。   那么,我们在此先提出几个问题: 1.预处理是C语言的一部分吗? 2.包含#号的都是预处理吗? 3.预处理指令后面是不...

Eyoru的博客 3万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

c语言编译预处理指令大全,C语言预处理指令

「今天是学习C语言第 32天」当你选择了一种语言,意味着你还选择了一组技术、一个社区。——Joshua Bloch# 预处理C语言源程序先经过预处理器进行预处理,之后经过编译器编译成二进制可执行代码执行。一般编译器套件、集成开发工具都将两种工具集成,预处理过程和编译过程一并处理。C语言预处理是通过预处理指令实现,每个预处理指令以#符号开头,以行为单位,实现编译前的准备工作,例如文件条件引入、宏替...

weixin_33134753的博客 3218

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C语言-编译预处理

也称为宏替换。由宏定义的命令完成。分为有参宏和无参宏。# define 标识符 字符串#define为宏定义的命令。标识符为所定义的宏名。字符串可以是常数、表达式、格式串等。宏定义不是一条语句,它是一条命令。如果加了分号,分号作为宏字符串的一部分。宏的作用域为宏定义命令开始起到源程序结束。如果要终止其作用域(提前结束),可使用#undef命令。宏定义的字符串中可以使用已经定义的宏名,宏展开时由预处理程序层层替换。#define PI3.14159#define 标识符。

qq_33892084的博客 1576

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

c语言预处理

C语言以C关键字、表达式、语句,以及这些元素的使用规则为基础。ANSI C标准不仅描述了C语言,还描述了C预处理器的工作机制。在 编译之前 ,先由预处理器检查程序,根据程序中使用的预处理器指令,使用符号缩略语所代表的内容替换程序中的缩略语。 预处理之前的翻译 在程序预处理之前,编译器会先做几次翻译处理。编译器先把源代码中出现的字符映射到源字符集。该过程处理多字节字符和使C外观更加国际化

u010645943的专栏 603
上一篇: const
下一篇: scanf的深究与清除缓冲区的那些方法
SYP35
博客等级 码龄12年 26粉丝 88原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值