以预编译头文件为Stdafx.h为例:
Qt Creator中很简单,只需在.pro文件中加入一行PRECOMPILED_HEADER = stdafx.h
VS2008在工程中在Stdafx.h文件上右键propertis-Configuration Properties-C/C++-Precompiled Headers-Create/Use Precompiled Header中选择Create Precompiled Header(/y).
有一点注意的是,在工程Generated Filed中的moc相关文件也需要选上Use Precompiled Header (/Yu).
2. 求C语言中预编译命令表
1 宏定义即是字符串替换。宏分为无参宏和含参宏。定义宏的位置可以在函数外部也可以在函数内部(vc++ 2008 测试通过)。宏的作用域是从定义处到取消定义命令[#undef 宏名]之间的部分,若无显式的#undef命令则默认到文件结束。可以使用defined命令可以判断宏是否被定义#if defined X (=#ifdef X),#if !defined X (= ifndef X)。 定义含参宏格式如#define SQ(y) ((y)*(y)),其中参数为y,宏得到的是y平方。为了保证宏替换的正确性,多加了3个括号。但这样的保证也是有限的,它要求y的值不能在(y)内改变,如把y换成i++将得不到期望的结果。 宏调用(实际上是宏替换)不用考虑形参的类型,这带来一定的好处。如求两个数最大值的宏#define MAX(a,b) (a>b)?a:b,实参可以是int,double等。宏定义可以包括多个语句,如#define CHANGE(X1,X2,X3,X4) X1 += 1;X2 += 2; X3 += 3; X4 +=4; 2 文件包含命令#include的功能是把指定的文件插入该命令行位置取代该命令行,从而把指定的文件和当前的源程序文件连成一个源文件。 源代码分布于多个文件时,建议使用调用文件+头文件+实现文件的模式。头文件中包含要用到的函数说明,类型定义,宏定义,常数值等。具体的实现放在实现文件中。在调用文件和实现文件中都包含该头文件即可。为了避免重复包含头文件,可在头文件中使用#ifndef [头文件标示符(如X_Header等等)] + 头文件内容 + #endif模式。 3 条件编译命令可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。 这对于程序的移植和调试很有用。条件编译有三种形式,下面分别介绍:
第一种形式根据有无对应宏定义选择编译程序段:
#ifdef 标识符 // 或 #ifndef 标示符
程序段1
#else
程序段2
#endif 第二种形式根据常量表达式值选择编译,值为非0执行if段。#if 常量表达式
程序段1
#else
程序段2
#endif
这里一定要是常量表达式,一般为宏。若是表达式包含变量则编译器只能随便猜一个了。 第三种形式含有#elif,看个例子吧#define ABC 3
void main(){#if ABC>0
int a=1;
printf("%d/n",a);
#elif ABC<0
int b=-1;
printf("%d/n",b);
#else
int c=0;
printf("%d/n",c);
#endif
} 其余的预编译命令如下,这里就不研究它们了。#line 标志该语句所在的行号
# 将宏参数替代为以参数值为内容的字符窜常量
## 将两个相邻的标记(token)连接为一个单独的标记
#pragma 说明编译器信息#warning 显示编译警告信息
#error 显示编译错误信息
3. C语言预编译命令
<>里面为库文件名
stdio为基本输入输出库,
string为字符串操作库
详细的可以看这个:
http://..com/question/257653832.html
4. 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源程序的名称。预编译程序对于在源程序中出现的这些串将用合适的值进行替换。
注意:
预编译程序所完成的基本上是对源程序的“替代”工作。经过此种替代,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。这个文件的含义同没有经过预处理的源文件是相同的,但内容有所不同。下一步,此输出文件将作为编译程序的输出而被翻译成为机器指令。
5. 问题:1.C语言程序能有多少个main()函数2.一个C文件能有多少个main函数 3.main()能放在#指令前吗
1.
c语言程序只能有一个main函数,因为main函数是整个进程的入口
2.
一个c文件可以有1或者0个main,但是一卜碰橘个c程序只能有1个main
3.
带#的这些型团都属于吵巧预编译指令,你可以放在任意位置,但是由于编译器是从上到下顺序编译的,加入你定义了一个宏#define在main函数里有使用,而宏却在main函数之后,所以预编译的时候main函数内的相关部分宏不会被替换,所以对于预编译指令最好放在文件的开头
纯手打,望采纳
6. 什么是预编译,何时需要预编译
预编译又称为预处理,是做些代码文本的替换工作
预编译又称为预处理,是做些代码文本的替换工作
处理#开头的指令,比如拷贝#include包含的文件代码,#define宏定义的替换,条件编译等
就是为编译做的预备工作的阶段
主要处理#开始的预编译指令
预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。常见的预编译指令有:
(1)#include 指令
该指令指示编译器将xxx.xxx文件的全部内容插入此处。若用<>括起文件则在系统的INCLUDE目录中寻找文件,若用" "括起文件则在当前目录中寻找文件。一般来说,该文件是后缀名为"h"或"cpp"的头文件。
注意:<>不会在当前目录下搜索头文件,如果我们不用<>而用""把头文件名扩起,其意义为在先在当前目录下搜索头文件,再在系统默认目录下搜索。
(2)#define指令
该指令有三种用法:
第一种是定义标识,标识有效范围为整个程序,形如#define XXX,常与#if配合使用;
第二种是定义常数,如#define max 100,则max代表100(这种情况下使用const定义常数更好,原因见注1);
第三种是定义"函数",如#define get_max(a, b) ((a)>(b)?(a):(b)) 则以后使用get_max(x,y)就可以得到x和y中较大的数(这种方法存在一些弊病,见注2)。
第四种是定义"宏函数",如#define GEN_FUN(type) type max_##type(type a,type b){return a>b?a:b;} ,使用时,用GEN_FUN(int),则此处预编译后就变成了 max_int(int a,int b){return a>b?a:b;},以后就可以使用max_int(x,y)就可以得到x和y中较大的数.比第三种,增加了类型的说明。
(3)#if、#else和#endif指令
这些指令一般这样配合使用:
#if defined(标识) //如果定义了标识
要执行的指令
#else
要执行的指令
#endif
在头文件中为了避免重复调用(比如说两个头文件互相包含对方),常采用这样的结构:
#if !(defined XXX) //XXX为一个在你的程序中唯一的标识符,
//每个头文件的标识符都不应相同。
//起标识符的常见方法是若头文件名为"abc.h"
//则标识为"abc_h"
#define XXX
真正的内容,如函数声明之类
#endif
7. C语言预编译命令#include<myfile.h>与#include"myfile.h"的功能
正确。
在用法上,只是查找文件路径的顺序不同,<>包含,会默认优先查找系统文件,然后是工程文件和当前目录下文件,而""包含,会默认优先查找当前工程和目录下文件,这对于自定义头文件是没有区别的。
8. 预编译命令行由什么符号开头
#include "stdio.h"
#define P 3
void *F(int x)/*定义一个无类型函数,它有返回值,只是返回的值是指向无类型数据的指针*/
void main(){printf("%d\n",(int)F(1+3));/*将无类型函数F返回的指针值通过(int)强制转换为int型*/
还有几个问题,
1.预处理命令行必须位于源文件的开头是对是错?为什么?
对!
编译器在编译源代码时都是从开头到结尾依次读取,自己定义的变量、宏等等都得放前面,这样在编译器在读到它们时就作一个记录;
在使用这些变量、宏时,编译器会在记录中去寻找,如果找不到就会报错——此变量未被定义。
函数可以放在结尾(main()之后),但是必须在开头作一个函数声明(也叫函数原型)以使编译器为它作记录,以便含正以后使用它时可以在记录中找到它。
函数也可以放在前面(main()之前),此时就不用再声明了,编译器在读到它时也会作一个记录。
总之,自己定义的东西都得先声明后使用,否则使用时在记录中会找不到它。
预处理命令也是自己定义的东西,同属这一范畴。
2.为什么在源文件的一行上不能有多条预处理命令?
每条C语句都有一个“;”作结尾,即使都放一行,编译器都能分辨得出。
预处理命令并不以“#”作为结尾标记,放一行的话编译器是无法分辨的,它会把此行作为一个语句处理
通常的语句最好都分行写,否则程序量大时是不便排错的。
3.若有下列说明和定义
union dt
date;
变量data所占内存字节数与成员c所占字节数相同,为什么?
联合体的长度是其最长成员(如double c)的长度。
联合体在内存中的存储形式:
联合体所有成员a,b,c都是同一地址,也就是说他们共同占用这一段内存。
以TC3.0为例,a占这一段内存的头2个字节,b占这一段内存的头一个字节,c占这一段内存的全部字节(也就是头4个字节)
4.为什么以下不对
char *sp;*sp="right!";
char s[10];s="right!";
一、进行字符串赋值时可以在定义时:直接在字符串定义后接“="right"”
如:char *sp="right";
或者 char s[10]="right";
二、也可以在非定义时,这时左值必须是禅慧左值必须是字符串指针变量。
如:sp="right!";
以下都是错误用法:
*sp="right!";//左值不是字符串指针谈袭悔变量
s="right!";//左值只是字符串指针 常量
1、如果说*a包含(x和\0),而*b包含(x和y),拿*a-*b会得出什么结果,*a和*b都是char型变量的话
最终的表达式*a-*b中,a points to '\0',b points to 'y',so 表达式*a-*b代表的是'\0'-'y',结果是-121(y的ASCII是121)
point(char*p)
main()
{
char b[4]={'a','b','c','d'),*p=b;
point(p); printf("%c\n",*p);
}
A.a B.b C.c D.d
选哪个?为什么?
选D,p最初是首地址b,然后p是b+3,此时*p相当*(b+3)、b[3].
2号问题:
main()
,,,},i,j;
for(i=0;i<4;i++)
{for (j=0;j<i,j++)
printf("%4c",' ');/*原题就是'和'之间只有个空格,我也不清楚是怎么回事*/
for(j=__;j<4;j++)
printf(%4d",num[i][j]);
printf("\n");
}
}
printf("%4c",' '); 其中的' '其实是一个空格字符常量,这个同'a','b','c'等字符常量是一样的。
这个语句中%4c是指要读取一个字符(这个字符就是后面的空格字符常量' ')并输出,这个字符在显示器上应该占4格。所以此句的功能是输出4个空格(空格也是属于字符)。
你改成printf("%4c",'a');printf("%4c",'b');试下,它是输出3个空格和一个字符。
printf("%8c",' ');是输出8个空格,这个比printf(" ");来实现输出8个字符来得方便。
若要按下列形式输出数组右上半三角(什么玩意?)。
1 2 3 4 i=0,j=i,那么j可以是0,1,2,3
6 7 8 i=1,j=i,那么j可以是1,2,3
11 12 i=2,j=i,那么j可以是2,3
16 i=3,j=i,那么j可以是3
则下划线处应填入的是?为什么?(B)
A.i-1 B.i
C.i+1 D.4-i
3号问题:
程序中若有下列说明和定义语句:
char fun(char*);
main()
{
char *s="one",a[5]=,(*fl)()=fun,ch;
......
}
下列选项中对函数的正确调用语句是?为什么?
A.(*fl)(a);
B.*fl(*s);
C.fun(&a);
D.ch=*fl( s);
选择A,根据定义char fun(char*),形参必须是一个字符指针,"a","s"才是字符指针(char pointer),而"*s" is char variable,"&a" is invalid.所以排除B、C
只有fun、*fl才是函数入口地址.
B.*fl(*s);相当于*(fl(*s)),错误,指针运算符只能针对指针运算,fl(*s)得到的是int,不是指针,下同。故排除B、D.
D.*fl( s);相当于*(fl( s));
4号问题
#define S(x) 4*x*x+1
main()
{
int i=6,j=8;
printf("%d",S(i+j));
getchar();
}
这个函数的输出结果是多少?怎么得的?
得到81.
因为S(i+j)经过预编译用i+j替换x后,它被展开为4*i+j*i+j+1。即(4*6+8*6+8+1)
你应该这样改:
#define S(x) 4*(x)*(x)+1
或者 printf("%d",S((i+j)));即将i+j用括号括起来(i+j),这样就在替换时用(i+j)替换x
9. 预编译命令都有哪些
一、预编译命令具体什么意思?哪锋
答:预编译命令是由ANSI C统一规定的,但是它不是C语言的组成部分册清,不能直接对它们进行编译。必须在对程序进行通常的编(包括词法和语法分析,代码生成,优化等)之前,先对程序中这些特殊的命令进行“预处理”,你慢慢悟,我小学生文化都看懂皮毛了,我不信你不知道它的意思。
二、#include <stdio.h>什么意思?
答:把stdio.h这个文件包含进来,至于stdio.h是什么,你自己慢慢看。
三、 void main()这个是什么意思??
答:加州缓前void 表示无类型,
我们知道main()是系统调用的,
那么在main()前面加 void就保证系统不使用main()函数带回的任何值。
10. MFC源代码是如何链接到程序中的
1. 预处理
预处理相当于根据预处理指令组装新的C/C++程序。经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内容上有所不同。
读取C/C++源程序,对其中的伪指令(以#开头的指令)进行处理
①将所有的“#define”删除,并且展开所有的宏定义
②处理所有的条件编译指令,如:“#if”、“#ifdef”、“#elif”、“#else”、“endif”等。这些伪指令的引入使得程序员可以通过定义不同的宏来决定编译程序对哪些代码进行处理。预编译程序将根据有关的文件,将那些不必要的代码过滤掉。
③处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置。
(注意:这个过程可能是递归进行的,也就是说被包含的文件可能还包含其他文件)
删除所有的注释
添加行号和文件名标识。
以便于编译时编译器产生调试用的行号信息及用于编译时产生的编译错误或警告时能够显示行号
保留所有的#pragma编译器指令
2. 编译
将预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后,产生相应的汇编代码文件。
3. 汇编
将编译完的汇编代码文件翻译成机器指令,并生成可重定位目标程序的.o文件,该文件为二进制文件,字节编码是机器指令。
汇编器是将汇编代码转变成机器可以执行的指令,每一个汇编语句几乎都对应一条机器指令。所以汇编器的汇编过程相对于编译器来讲比较简单,它没有复杂的语法,也没有语义,也不需要做指令优化,只是根据汇编指令和机器指令的对照表一一翻译即可。
4. 链接
通过链接器将一个个目标文件(或许还会有库文件)链接在一起生成一个完整的可执行程序。
由汇编程序生成的目标文件并不能立即就被执行,其中可能还有许多没有解决的问题。
例如,某个源文件中的函数可能引用了另一个源文件中定义的某个符号(如变量或者函数调用等);在程序中可能调用了某个库文件中的函数,等等。所有的这些问题,都需要经链接程序的处理方能得以解决。
链接程序的主要工作就是将有关的目标文件彼此相连接,也就是将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够被操作系统装入执行的统一整体。
至此,大致经过这几个步骤,一个完整的可执行程序产生了。