导航:首页 > 源码编译 > 没有预定义可以通过编译吗

没有预定义可以通过编译吗

发布时间:2022-11-02 22:22:17

1. 编译和预编译有什么区别。

预编译又称为预处理,是做些代码文本的替换工作。

处理#开头的指令,比如拷贝#include包含的文件代码,#define宏定义的替换,条件编译等

就是为编译做的预备工作的阶段

主要处理#开始的预编译指令
编译(compilation , compile) 1、利用编译程序从源语言编写的源程序产生目标程序的过程。 2、用编译程序产生目标程序的动作。 编译就是把高级语言变成计算机可以识别的2进制语言,计算机只认识1和0,编译程序把人们熟悉的语言换成2进制的。

2. 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源程序的名称。预编译程序对于在源程序中出现的这些串将用合适的值进行替换。

注意:

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

3. C++中p没有定义 为什么编译能通过

C++的处理机制是分模块的,用户自己创建的话,它有一个模块处理,只预编译头文件,可以提高编译速度,尤其对于大程序。而设计模板的时候,C++就会调用模板处理模块,那个模块可能就是默认.h和.cpp在一起的,而且你可以想象一下,如果只编译.h的话,如果你的程序中使用了模板的某个具体部分,C++还是需要处理模板中.cpp的部分,而这部分没有被编译,会出问题的。

也就是说,你编了一个具有公共使用功能的模板,编译的时候只预编译了头文件 .h,但是你的模板是分开的。写在了.cpp里, 只有调用的时候才会处理模板中.cpp的部分 才会出现错误。所以不会报错 。你换在.h里就好报错了

4. 编译命令里有带预定义宏的命令吗

DEBUG宏是在编译时根据编译的版本是DEBUG还是RELEASE由编译器临时插入的。这些类似的宏是根据你对工程所做的设置由编译器插入的。你也可以自己定义一组宏写到一个外部文件里,把这个外部文件在工程属性的命令行里,用@引入进来,这样就能在外部文件中对编译进行控制。编译相关的宏设置很多,编译器选项的命令也非常多,不同编译器支持的命令也不一样,网络一下编译选项,或者再深入研究一下你的集成开发环境吧,具体我也记不太清了,多搜搜肯定有。

5. 为什么在编写程序中使用预定义的宏编译不通过啊

宏定义只是在程序编译时编译器自动替换相应的宏,而const定义的是常量便于进行类型检查
define是简单的替换
const ABC value 会进行类型检查

6. 没有声明函数也可以通过编译

如果该函数声明的修饰符为public类型的,在main中当然可以直接调用了。public不受调用限制

7. “C语言的预处理 不能实现宏定义和条件编译的功能”和“C语言的预处理不能实现宏定义和条件编译的功能”

这两句话是一个意思, C语言中的预处理,是可以实现宏定义和条件编译功能的。比如下面的代码定义了一个宏S,它的值是”hello world ",可以用printf函数直接打印出来。

#include<stdio.h>
#defineS"helloworld "
intmain()
{
printf(S);
return0;
}

C语言中的预处理也可以实现条件编译功能,预处理到现在依然存在的一个重要原因就在于此。比如下面的代码:

#include<stdio.h>
intmain()
{
#ifdef_DEBUG
printf("程序生成的debug版 ");
#else
printf("程序生成的是release版 ");
#endif
return0;
}

8. C/C++ 的预编译原理是什么为什么要用预编译

为了防止程序在实际应用当中出现错误

9. C++如何定义一个预定义变量

C++预定义变量:

1)__LINE__ 和 __FILE__ 变量表示正在处理的当前行和当前文件。__FILE__ 这个变量对于要获取当前程序的路径很有用,可以简单的通过string str(__FILE__ )就可以得到当前程序的路径。

2)__DATE__ 变量表示当前日期,格式为month/day/year(月/日/年)。

3)__TIME__ 变量描述当前的时间,格式为hour:minute:second(时:分:秒)。

4)_cplusplus 变量只在编译一个C++程序时定义。

下面通过程序来查看这几个变量的内容,代码如下:

int main( int argc, char*argv[])
{
string str1(__FILE__);
string str2(__TIME__);
string str3(__DATE__);
cout<<str1<<endl;
cout<<str2<<endl;
cout<<str3<<endl;

return 0;
}

程序执行结果如下:

10. C语言的预定义

1.使用预定义,可以实现函数的移植。
不管在各个种平台上,都可以实现:
#define TRUE 1
#define FALSE 0
#define long INT
#define int INT //有的机器int与short的长度相同
#define short SHORT
2.使用预定义可以定义一些简单的函数,且效率很高。因为编译完成替换
#define MIN(a,b) ((a)<(b)?(a):(b))
3.使用预定义可以防止头文件重复编译。
#ifndef _H_HEAD_H_
#define _H_HEAD_H_ aa
.... //相应的头文件内容
#endif

不好的地方就是:
使用预定义易出错,且出错时,难以检查。

阅读全文

与没有预定义可以通过编译吗相关的资料

热点内容
游戏开发程序员书籍 浏览:841
pdf中图片修改 浏览:268
汇编编译后 浏览:473
php和java整合 浏览:829
js中执行php代码 浏览:440
国产单片机厂商 浏览:57
苹果手机怎么设置不更新app软件 浏览:284
转行当程序员如何 浏览:492
苹果id怎么验证app 浏览:864
查看手机命令 浏览:953
抖音反编译地址 浏览:225
如何加密软件oppoa5 浏览:233
java从入门到精通明日科技 浏览:94
拆解汽车解压视频 浏览:597
新版百度云解压缩 浏览:592
android上下拉刷新 浏览:880
centos可执行文件反编译 浏览:838
林清玄pdf 浏览:271
黑马程序员java基础 浏览:284
awss3命令 浏览:359