导航:首页 > 源码编译 > 字符替换预编译

字符替换预编译

发布时间:2022-11-27 23:52:43

1. #define N 10 int x[N] ;与int N=10 ;int x[10];为什么前面对,后面这个是错的

#define N 10,是预编译过程,在编译前会把所有的N替换成10,因此int x[N]在编译前会被换成:int x[10];,N即常量10,因此不会有错。
至于 后面int N = 10; int x[N]; N为变量,在c语言中,是不允许的。

2. C语音中的符号常量的定义方法是什么

符号常量定义用#define。

符号常量在使用之前必须先定义,其一般形式为:

形式为:#define 标识符 常量

eg: #define PI 3.14 //没有分号

#define 是一条预编译命令(预处理命令都以"#"开头),称为宏定义命令,在预编译时仅仅是进行字符替换。符号常量不占内存,只是一个临时符号,在预编译后这个符号就不存在了,故不能对符号常量赋以新值。习惯上符号常量的标识符用大写字母,变量标识符用小写字母,以示区别。

3. 在java中如何实现预编译

/*
* ProCompile.java *预处理要编译的文件,删除多余的空白,注释,换行,回车等
* Created on 2007年9月18日, 下午8:58 */ package javacompile; import java.io.*;
import java.util.regex.*;
import javax.swing.JOptionPane; /** * @com.junjian.sun public class PerCompile { File f = null;
String fileString = null;
Pattern p = null;
Matcher m = null;
String regex; //正则表达式 //初始化p
public PerCompile() {
regex ="(//.+)" + //(//.+) 对应单行注释
//"|(/\\*(.+\\n)+\\*/)"+ // 想对应多行注释... "|(\\r\\n)" + "|(\\n)"+//(\\r\\n)|(\\n)对应换行
"|(\\B\\s+)" ; // 空白符
String ss;
f = new File(new JOptionPane()
.showInputDialog("请输入文件所在路径~"));
try {
BufferedReader bf = new BufferedReader(new FileReader(f));
ss = bf.readLine()+"\n";
fileString = ss; //如果没有这两句,ss的开头会有“null”
while((ss = bf.readLine())!= null){
fileString += ss+"\n"; bf.close();
} catch (IOException ex) {
ex.printStackTrace(); p = Pattern.compile(regex);
m = p.matcher(fileString); //执行替换所有多余空行,空白符,注释
void Dels(){
System.out.println("before: "+fileString);
if(m.find()) System.out.println("find!!");
System.out.println(m.replaceAll("")); } }

-

4. 设有宏定义:&define MUL(x,y)x*y则宏调用MUL(2+3,5)的结果为17

是的。

造成这种结果的原因,是由于宏定义本身的特性造成的:

define仅仅是字符替换,因此在将NUL(2+3,5)时,x是2+3,y是5,直接将表达式x*y替换字符后,则变成了2+3*5,其计算结果在乘法优先于加法的作用下会得到17这个数值。

为了避免这种情况,有两种办法解决

  1. 定义更安全的宏定义,即使用括号将表达式括起来,避免了优先级在替换后变化。

    define MUL(x,y) (x)*(y)

  2. 将宏定义改变为函数

    int MUL(int x,int y){

    return(x*y);

}

5. C语言#define X 23.6f,X为什么是一串字符呀

define 宏定义
预编译时 做字符串替换 操作
可以的话,尽量 用括号,避免出错
#define X 23.6f

6. C语言 宏

难道3不能是字符串吗?

"3*pi"是字符串,"3"是它的子串。
"3*pi"宏展开后为"3*3.1415926"也是字符串,整个源程序都被认为字符串!

现在,还有有编译,编译时,编译器会把3*3.1415926当表达式计算,用结果再替换一次!

7. 宏定义的格式

1.不带参数的宏定义: 宏定义又称为宏代换、宏替换,简称“宏”。 格式: #define 标识符 字符串 其中的标识符就是所谓的符号常量,也称为“宏名”。 预处理(预编译)工作也叫做宏展开:将宏名替换为字符串。 掌握"宏"概念的关键是“换”。一切以换为前提、做任何事情之前先要换,准确理解之前就要“换”。 即在对相关命令或语句的含义和功能作具体分析之前就要换: 例: #define PI 3.1415926 把程序中出现的PI全部换成3.1415926 说明: (1)宏名一般用大写 (2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义 (3)预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查。 (4)宏定义末尾不加分号; (5)宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头。 (6)可以用#undef命令终止宏定义的作用域 (7)宏定义可以嵌套 (8)字符串" "中永远不包含宏 (9)宏定义不分配内存,变量定义分配内存。 2.带参数的宏: 除了一般的字符串替换,还要做参数代换 格式: #define 宏名(参数表) 字符串 例如:#define S(a,b) a*b area=S(3,2);第一步被换为area=a*b; ,第二步被换为area=3*2; 类似于函数调用,有一个哑实结合的过程: (1)实参如果是表达式容易出问题 #define S(r) r*r area=S(a+b);第一步换为area=r*r;,第二步被换为area=a+b*a+b; 正确的宏定义是#define S(r) (r)*(r) (2)宏名和参数的括号间不能有空格 (3)宏替换只作替换,不做计算,不做表达式求解 (4)函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译前进行,不分配内存 (5)宏的哑实结合不存在类型,也没有类型转换。 (6)函数只有一个返回值,利用宏则可以设法得到多个值 (7)宏展开使源程序变长,函数调用不会 (8)宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)

8. c语言编译预处理

编译,编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序。

如果用一张图来表示:

读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理

[析] 伪指令主要包括以下四个方面

(1)宏定义指令,如#define Name TokenString,#undef等。对于前一个伪指令,预编译所要做的是将程序中的所有Name用TokenString替换,但作为字符串常量的Name则不被替换。对于后者,则将取消对某个宏的定义,使以后该串的'出现不再被替换。

(2)条件编译指令,如#ifdef,#ifndef,#else,#elif,#endif,等等。这些伪指令的引入使得程序员可以通过定义不同的宏来决定编译程序对哪些代码进行处理。预编译程序将根据有关的文件,将那些不必要的代码过滤掉

(3)头文件包含指令,如#include "FileName"或者#include 等。在头文件中一般用伪指令#define定义了大量的宏(最常见的是字符常量),同时包含有各种外部符号的声明。采用头文件的目的主要是为了使某些定义可以供多个不同的C源程序使用。因为在需要用到这些定义的C源程序中,只需加上一条#include语句即可,而不必再在此文件中将这些定义重复一遍。预编译程序将把头文件中的定义统统都加入到它所产生的输出文件中,以供编译程序对之进行处理。

包含到c源程序中的头文件可以是系统提供的,这些头文件一般被放在/usr/include目录下。在程序中#include它们要使用尖括号(<>)。另外开发人员也可以定义自己的头文件,这些文件一般与c源程序放在同一目录下,此时在#include中要用双引号("")。

(4)特殊符号,预编译程序可以识别一些特殊的符号。例如在源程序中出现的LINE标识将被解释为当前行号(十进制数),FILE则被解释为当前被编译的C源程序的名称。预编译程序对于在源程序中出现的这些串将用合适的值进行替换。

注意:

预编译程序所完成的基本上是对源程序的“替代”工作。经过此种替代,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。这个文件的含义同没有经过预处理的源文件是相同的,但内容有所不同。下一步,此输出文件将作为编译程序的输出而被翻译成为机器指令。

9. 宏替换只是字符替换,不占用编译时间是不是正确

宏是在预编译期间进行的,将代码中的指定字符转换
转换结束后,再进行编译
所以不占用编译时间

10. 4.宏替换就是字符替换,不能进行任何计算。 (2分)

这句话是对的。宏替换只作替换,不做计算,不做表达式求解。

不带参数的宏代换,格式为: #define 标识符 字符串

带参数的宏代换:除了一般的字符串替换,还要做参数代换。

格式为:#define 宏名(参数表) 字符串



(10)字符替换预编译扩展阅读

宏的优缺点

优点:

1、增强代码的复用性。

2、提高性能。

缺点:

1、不方便调试宏。(因为预编译阶段进行了替换)

2、导致代码可读性差,可维护性差,容易误用。

3、没有类型安全的检查。

阅读全文

与字符替换预编译相关的资料

热点内容
服务器无响应是什么原因呀 浏览:978
wd文档里的app怎么制作 浏览:509
电脑里的文件夹没有了一般能恢复吗 浏览:410
哪里有配加密钥匙的 浏览:208
服务器开不了机怎么把数据弄出来 浏览:958
gif动态图片怎么压缩 浏览:519
黑猴子棒球压缩文件解压密码 浏览:631
如何让app适应不同的手机屏幕大小 浏览:8
苹果手机如何给安卓手机分享软件 浏览:759
苹果电脑怎么运行腾讯云服务器 浏览:59
明日之后沙石堡命令助手 浏览:261
蛋糕店用什么样的app 浏览:877
长安银行信用卡app怎么取现 浏览:635
dos命令cmd命令的 浏览:226
阿里云存档视频文件的服务器 浏览:194
ftp修改文件权限命令 浏览:491
周易八卦梅花算法 浏览:676
java组织机构 浏览:953
h5大转盘游戏源码 浏览:592
学校服务器地址查询 浏览:109