首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

预加工,有时琢磨不透-小话c语言(24)

2012-09-08 
预处理,有时琢磨不透----小话c语言(24)作者:陈曦日期:2012-7-2818:19:55环境:[Mac 10.7.1 Lion Intel i3

预处理,有时琢磨不透----小话c语言(24)

作者:陈曦

日期:2012-7-28  18:19:55

环境:[Mac 10.7.1 Lion Intel i3 支持64位指令 gcc4.2.1 xcode4.2]  

转载请注明出处


Q1: 宏这个东西真是很奇怪,为什么我想将一句#include代码用宏来替换,却不行?


A: 如果是预处理出了问题,我们可以使用-E查看预处理后的结果,来分析到底哪里出了问题。

预加工,有时琢磨不透-小话c语言(24)


Q2: 由上面看,好像没有什么问题。

A: 看起来是没有什么问题,问题在于上面的结果是预处理后的结果。编译器编译预处理后的源代码还出现了#include, 编译器是不识别的,所以会报错。换句话说,预处理做预处理的事情,编译器做编译源代码的事情(不过编译器常常被看做包括预处理的功能).预处理器可以处理#include, 而编译器根本无法识别#include.


Q3: 预处理当发现INCLUDE_STDIO符号是#include<stdio.h>时为什么没有继续预处理此头文件的内容?

A: 这就在于c语言标准规定#define定义的符号是进行重新预处理的,但是仅限于#define的符号,遇到#include是不做处理的。 


Q4: 有时,需要测试数据,写了好多相同名称开头的变量,最后进行赋值,有什么好方法?

A: 这当然需要用到##符号了,它可以正确生成你需要的变量。如下代码:

由上图可以看出,确实使用了PRINT(str)这个宏来替换,所以导致崩溃。



Q9: 有时,希望可以根据sizeof(int)的数值来做一些提示,为什么下面的代码会出现编译错误?

#include <stdio.h>int main(){    printf("%u\n", sizeof(long));    return 0;}

保存为preprocess_if.c .


gcc -o preprocess_if preprocess_if.c -arch i386编译后执行,结果为4.

gcc -o preprocess_if preprocess_if.c -arch x86_64编译后执行,结果为8.




作者:陈曦

日期:2012-7-28  18:19:55

环境:[Mac 10.7.1 Lion Intel i3 支持64位指令 gcc4.2.1 xcode4.2]  

转载请注明出处



热点排行
Bad Request.