在C语言中,预处理指令有什么作用?比如#define 宏名 字符串
展开全部
C语言预处理程序的作用是根据源代码中的预处理指令修改你的源代码。预处理指令是一种命令语句(如#define),它指示预处理程序如何修改源代码。在对程序进行通常的编译处理之前,编译程序会自动运行预处理程序,对程序进行编译预处理,这部分工作对程序员来说是不可见的。
预处理程序读入所有包含的文件以及待编译的源代码,然后生成源代码的预处理版本。在预处理版本中,宏和常量标识符已全部被相应的代码和值替换掉了。如果源代码中包含条件预处理指令(如#if),那么预处理程序将先判断条件,再相应地修改源代码。
下面的例子中使用了多种预处理指令:
# include <stdio. h>
# define TRUE 1
# define FALSE (!TRUE)
# define GREATER (a, b) ((a) > (b) ? (TRUE) : (FALSE))
# define PIG-LATIN FALSE
void main (void);
void main (void)
{
int x, y;
# if PIG_LATIN
printf("Easeplay enternay ethay aluevay orfay xnay:") ;
scanf("%d", &x) ;
printf("Easeplay enternay ethay aluevay orfay ynay:");
scanf("%d", &y);
#else
printf(" Please enter the value for x: ");
scanf("%d", &x);
printf("Please enter the value for y: ");
scanf("%d", &y);
# endif
if (GREATER(x, y) = = TRUE)
{
# if PIG- LATIN
printf("xnay islay eatergray anthay ynay!\n");
#else
printf {" x is greater than y! \n" ) ;
# endif
}
else
{
# if PIG_LATIN
printf ("xnay islay otnay eatergray anthay ynay!\n");
#else
printf ("x is not greater than y!\n");
# endif
}
}
上例通过预处理指令定义了3个标识符常量(即TRUE,FALSE和PIG_LATIN)和一个宏(即GREATER(a,b)),并使用了一组条件编译指令。当预处理程序处理上例中的源代码时,它首先读入stdio.h头文件,并解释其中的预处理指令,然后把所有标识符常量和宏用相应的值和代码替换掉,最后判断PIG_LATIN是否为TRUE,并由此决定是使用拉丁文还是使用英文。
如果PIG_LATIN为FALSE,则上例的预处理版本将如下所示:
/ * Here is where all the include files
would be expanded. * /
void main (void)
{
int x, y;
printf("Please enter the value for X: ");
scanf("%d", &x);
printf("Please enter the value for y: ");
scanf("%d", &y),
if (((x) > (y) ? (1) : (!1)) == 1)
{
printf("x is greater than y!\n");
}
else
{
printf{"x is not greater than y!\n");
}
}
多数编译程序都提供了一个命令行选项,或者有一个独立的预处理程序,可以让你只启动预处理程序并将源代码的预处理版本保存到一个文件中。你可以用这种方法查看源代码的预处理版本,这对调试与宏或其它预处理指令有关的错误是比较有用的。
中国物联网校企联盟技术部
预处理程序读入所有包含的文件以及待编译的源代码,然后生成源代码的预处理版本。在预处理版本中,宏和常量标识符已全部被相应的代码和值替换掉了。如果源代码中包含条件预处理指令(如#if),那么预处理程序将先判断条件,再相应地修改源代码。
下面的例子中使用了多种预处理指令:
# include <stdio. h>
# define TRUE 1
# define FALSE (!TRUE)
# define GREATER (a, b) ((a) > (b) ? (TRUE) : (FALSE))
# define PIG-LATIN FALSE
void main (void);
void main (void)
{
int x, y;
# if PIG_LATIN
printf("Easeplay enternay ethay aluevay orfay xnay:") ;
scanf("%d", &x) ;
printf("Easeplay enternay ethay aluevay orfay ynay:");
scanf("%d", &y);
#else
printf(" Please enter the value for x: ");
scanf("%d", &x);
printf("Please enter the value for y: ");
scanf("%d", &y);
# endif
if (GREATER(x, y) = = TRUE)
{
# if PIG- LATIN
printf("xnay islay eatergray anthay ynay!\n");
#else
printf {" x is greater than y! \n" ) ;
# endif
}
else
{
# if PIG_LATIN
printf ("xnay islay otnay eatergray anthay ynay!\n");
#else
printf ("x is not greater than y!\n");
# endif
}
}
上例通过预处理指令定义了3个标识符常量(即TRUE,FALSE和PIG_LATIN)和一个宏(即GREATER(a,b)),并使用了一组条件编译指令。当预处理程序处理上例中的源代码时,它首先读入stdio.h头文件,并解释其中的预处理指令,然后把所有标识符常量和宏用相应的值和代码替换掉,最后判断PIG_LATIN是否为TRUE,并由此决定是使用拉丁文还是使用英文。
如果PIG_LATIN为FALSE,则上例的预处理版本将如下所示:
/ * Here is where all the include files
would be expanded. * /
void main (void)
{
int x, y;
printf("Please enter the value for X: ");
scanf("%d", &x);
printf("Please enter the value for y: ");
scanf("%d", &y),
if (((x) > (y) ? (1) : (!1)) == 1)
{
printf("x is greater than y!\n");
}
else
{
printf{"x is not greater than y!\n");
}
}
多数编译程序都提供了一个命令行选项,或者有一个独立的预处理程序,可以让你只启动预处理程序并将源代码的预处理版本保存到一个文件中。你可以用这种方法查看源代码的预处理版本,这对调试与宏或其它预处理指令有关的错误是比较有用的。
中国物联网校企联盟技术部
展开全部
预处理器的主要作用就是把通过预处理的内建功能对一个资源进行等价替 换,最常见的预处理有:文件包含,条件编译、布局控制和宏替换4种
文件包含:#include 是一种最为常见的预处理,主要是做为文件的引用组合 源程序正文。
条件编译:#if,#ifndef,#ifdef,#endif,#undef等也是比较常见的预处理, 主要是进行编译时
进行有选择的挑选, 注释掉一些指定的代码, 以达到版本控制、 防止对文件重复包含的功能。
布局控制:
#progma,这也是我们应用预处理的一个重要方面,主要功能是 为编译程序提供非常规的控制流信息。 宏替换:
#define,这是最常见的用法,它可以定义符号常量、函数功能、 重新命名、字符串的拼接等各种功能
文件包含:#include 是一种最为常见的预处理,主要是做为文件的引用组合 源程序正文。
条件编译:#if,#ifndef,#ifdef,#endif,#undef等也是比较常见的预处理, 主要是进行编译时
进行有选择的挑选, 注释掉一些指定的代码, 以达到版本控制、 防止对文件重复包含的功能。
布局控制:
#progma,这也是我们应用预处理的一个重要方面,主要功能是 为编译程序提供非常规的控制流信息。 宏替换:
#define,这是最常见的用法,它可以定义符号常量、函数功能、 重新命名、字符串的拼接等各种功能
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
种类很多,不同的运行环境,通常还会增加很多新的预处理命令,预处理命令是用来控制编译器的。。。可以告诉编译器,所使用的文件路径(#include),条件编译(在什么条件下编译,什么条件下不编译,if,ifdef,,endif) ,宏设置(define,用途是第1段字符串代替第2段字符串,比如#define NC int,编译器看到单独的NC,就会认为他是int,所以你可以 NC a,定义一个整型变量)。。。。
最为复杂的就是 pragma 很多不同运行环境的C程序都会添加一些自己添加的特殊的预处理控制命令,当然也都支持C语言固有的。。。他们前面都会有pragma 比如很多时候我希望使用汇编程序,写一段代码,那就可以 用 #pragma asm 来告诉编译器,在一些代码,经常还要控制数据存放的位置,同样需要#pragma 存储器名 :地址等。。。。
不管怎样,与处理命令都是用来控制编译器的,本身不是程序代码,就像我要求一个工人做一个东西,但有时我会提出特殊要求,要求使用特定工具或者特殊要求(pragma),或者告诉他某个材料的位置等等(#include),还有可能用一些暗语(宏),不过这些本身却不是程序代码,只是一种编译前的约定或必要的交代。。。。
最为复杂的就是 pragma 很多不同运行环境的C程序都会添加一些自己添加的特殊的预处理控制命令,当然也都支持C语言固有的。。。他们前面都会有pragma 比如很多时候我希望使用汇编程序,写一段代码,那就可以 用 #pragma asm 来告诉编译器,在一些代码,经常还要控制数据存放的位置,同样需要#pragma 存储器名 :地址等。。。。
不管怎样,与处理命令都是用来控制编译器的,本身不是程序代码,就像我要求一个工人做一个东西,但有时我会提出特殊要求,要求使用特定工具或者特殊要求(pragma),或者告诉他某个材料的位置等等(#include),还有可能用一些暗语(宏),不过这些本身却不是程序代码,只是一种编译前的约定或必要的交代。。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
预处理就是进行一个等价替换。如#include 文件名 ,就是编译时把相应文件替换包含进来;
#define则定义一个宏,代码中可能多次用到该常量,这样define后就会进行替换,方便常量值的修改
#define则定义一个宏,代码中可能多次用到该常量,这样define后就会进行替换,方便常量值的修改
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#define 宏名 字符串
当你在下面的程序中碰到你定义的宏名时,就自动的替换为你定义的字符串
such as :#define H(x) x*x+x
在程序中的H(x)就被替换为x*x+x,重点是,原样替换,就是你定义的是什么就按照那个形式原样替换而不能任意加括号
for example :当碰到H(2+2)应替换为:2+2*2+2+2+2=12,而不是(2+2)*(2+2)+(2+2)=20
当你在下面的程序中碰到你定义的宏名时,就自动的替换为你定义的字符串
such as :#define H(x) x*x+x
在程序中的H(x)就被替换为x*x+x,重点是,原样替换,就是你定义的是什么就按照那个形式原样替换而不能任意加括号
for example :当碰到H(2+2)应替换为:2+2*2+2+2+2=12,而不是(2+2)*(2+2)+(2+2)=20
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询