预编译命令行由啥符号开头?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了预编译命令行由啥符号开头?相关的知识,希望对你有一定的参考价值。

#号是官方定义的,用于和其他类型区别的,不用多考虑,你就看看我给你的链接看看官方的说法

条件编译符号#define ???
#if、#elif、#else 和 #endif 指令提供的条件编译功能是通过预处理表达式和条件编译符号来控制的。

conditional-symbol:(条件符号:)
除 true 和 false 外的任何标识符或关键字
条件编译符号有两种可能的状态:已定义的或未定义的。在源文件词法处理开始时,条件编译符号除非已由外部机制(如命令行编译器选项)显式定义,否则是未定义的。当处理 #define 指令时,在指令中指定的条件编译符号在那个源文件中成为已定义的。此后,该符号就一直保持已定义的状态,直到处理一条关于同一符号的 #undef 指令,或者到达源文件的结尾。这意味着一个源文件中的 #define 和 #undef 指令对同一程序中的其他源文件没有任何影响。

当在预处理表达式中引用时,已定义的条件编译符号具有布尔值 true,未定义的条件编译符号具有布尔值 false。不要求在预处理表达式中引用条件编译符号之前显式声明它们。相反,未声明的符号只是未定义的,因此具有值 false。

条件编译符号的命名空间与 C# 程序中的所有其他命名实体截然不同。只能在 #define 和 #undef 指令以及预处理表达式中引用条件编译符号。
参考技术A #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

Java虚拟机的启动时间由啥组成?

【中文标题】Java虚拟机的启动时间由啥组成?【英文标题】:What does the start-up time compose of in Java virtual machine?Java虚拟机的启动时间由什么组成? 【发布时间】:2012-06-15 00:58:38 【问题描述】:

有时我听到人们讨论 Java 的启动时间。看来这是一个重要的性能方面。但它到底是什么?

它由什么组成?
    动态类加载导致的类加载时间? 还是在只编译 JVM 中的首次编译开销? 或者其他导致 Java 程序执行初期“缓慢”的原因?

那么,第二个问题是

如何测量Java程序的启动时间?从哪一点到哪一点的持续时间称为启动时间?

我不知道我的问题是否以正确的方式提出;如果没有,请告诉我。谢谢!

【问题讨论】:

我一直听到这个术语被非正式地提及,我很好奇是否有人为它确定了一个正式的定义。 【参考方案1】:

启动时间没有正式定义。事实上,实际 IT 中使用的大多数术语都没有正式定义。 (或者忽略正式定义。)

但粗略地说,是从应用程序启动到准备好做一些有用的事情的时间。启动期间发生的事情取决于应用程序,但它包括静态类加载、静态类初始化和(可能)一些类的 JIT 编译。其他事情可能包括启动 UI、连接到数据库、预加载特定于应用程序的数据结构、应用程序“连接”等等。

尝试正式定义“启动时间”的问题在于,对于某些重要的应用程序类型子集,任何定义都可能不起作用。即使您可以定义它,在应用程序宣布自己为“就绪”后,一些启动(或预热)任务可能会继续在后台发生,这很复杂。

(这不是 Java 特定的问题。考虑一下笔记本电脑的“启动”;即在打开它的电源和您的桌面完全可用之间会发生什么。)

如何测量 Java 程序的启动时间?从哪一点到哪一点的持续时间称为启动时间?

这两个都由您决定,具体取决于您所谈论的应用程序的类型,以及希望将什么视为应用程序的启动阶段。

【讨论】:

【参考方案2】:

正如 Stephen C 提到的,“启动时间”没有通用的正式定义。

为了直观理解这个概念,我在Oracle's webs上找到了一些描述。

基本上,它给出了一个非正式的定义。 “应用程序的启动时间是应用程序启动并运行并准备开始执行它应该执行的操作所需的时间。” JVM 和应用程序本身都会影响启动-正常运行时间。

另外,它提供了一些想法(调整堆大小-Xms/-Xmx)来减少启动时间。太大或太小的堆大小都会延长启动时间。

此外,“Diagnosing a Slow JVM Startup”显示了一些线索,可以找到启动缓慢的原因。

注意以上都是JRockit JVM的上下文,但是思路比较笼统。

【讨论】:

以上是关于预编译命令行由啥符号开头?的主要内容,如果未能解决你的问题,请参考以下文章

linux下nm命令的使用

编译过程学习

程序运行之目标文件

MVC 5 - 预编译视图仅适用于命令提示符

播放预编译命令仅在预编译文件夹中生成一个类文件,而不为控制器、模型等生成类文件

预处理与编译