宏观上的困惑

时间:2010-03-09 12:14:29

标签: c c-preprocessor

以下代码可以正常使用

#define open {
#define close }
#include<stdio.h>
#define int char

 main()
 open
 int a ;
 printf("This is testing code" );
 close

但如果我换行

#include<stdio.h>
#define int char 

as

#define int char 
#include<stdio.h> 

它会引发很多像这样的错误

In file included from /usr/include/stdio.h:36,
                 from print.c:19:
/usr/include/bits/types.h:35: error: both 'short' and 'char' in declaration specifiers
/usr/include/bits/types.h:37: error: both 'long' and 'char' in declaration specifiers
/usr/include/bits/types.h:42: error: both 'short' and 'char' in declaration specifiers
/usr/include/bits/types.h:43: error: both 'short' and 'char' in declaration specifiers
.................................................
so and so 

实际上stdio.h中发生了什么?

3 个答案:

答案 0 :(得分:8)

定义了short intlong int等类型的变量,当您通过定义更改为short charlong char时,这些变量显然会失败。

重新定义基本C类型通常不是一个好主意。

答案 1 :(得分:5)

失败的原因是,#include<stdio.h>被替换为stdio.h的内容,当您在内容中将int替换为char时,您会破坏一些声明。

/usr/include/bits/types.h

间接包含的stdio.h
.
.
typedef unsigned short int __u_short;
.
.

当您将int替换为char时,显然会变为:

typedef unsigned short char __u_short;

导致编译错误的原因short无法应用于char数据类型。

答案 2 :(得分:0)

你的#define将被激活并将替换stdio.h中的所有int以及它包含的所有文件,从而导致太多令人困惑的错误。

因为,错误来自types.h,它必须修改一些东西,比如'short int'到'short char'等。