预处理,有时琢磨不透----小话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查看预处理后的结果,来分析到底哪里出了问题。
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]
转载请注明出处