2016-05-14 60 views
-6

我的问题相对简单但对我来说还是个谜。为什么预处理程序不扩展在代码中定义的类型

经过处理BLA_Str未扩展为bla_Str。这种情况:

#include <stdio.h> 
#include <stdint.h> 

typedef BLA_Str blaInstance; 

#define BLA_Str bla_Str 

typedef struct 
{ 
    int bla; 
}bla_Str; 

void main(void){ 
// printf("%u\n\r",5); 
} 
+1

预处理器不是通灵的。 –

+0

FFS C编译足够慢,因为它是。你想要通过源代码多少次? –

+0

你从哪里找到这段代码? –

回答

3

预处理只是对通过文件一次通过,扩大宏,因为它去,并添加宏的列表,当它遇到的#define。当它到达线

typedef BLA_Str blaInstance 

它还不了解BLA_Str宏,所以给人们留下它的产量不变。

您通常会将所有#define行放在开头,因此它们会影响文件其余部分的所有内容。

您可以在The C Book中找到关于C预处理器如何工作的合理总结。它解释:

有两种方法来定义宏,其中一种看起来像一个功能,一种看起来像一个功能,而另一种不是。下面是每个的一个示例:

#define FMAC(a,b) a here, then b 
    #define NONFMAC some text here 

两个定义定义一个宏和一些替换文本,这将被用来替换以后出现宏名称的在程序的其余部分。

如果宏扩展到另一个宏,这是通过重新扫描处理:

一旦发生上述处理,更换文本加上源文件的以下标记重新扫描,寻找更多的宏名称来取代。唯一的例外是,在宏的替换文本中,宏本身的名称不会被扩展。

+0

@Bramar“预处理器只执行文件的一次传递” 这是规则还是我的代码/文件是这样?例如 '的#define数字one' '的#define一个1' 'INT A =数字;' 该代码是好的,但如果预处理器通过该文件仅一次应该有错误。这只是我自己的推理。 – Hairi

+0

它只经过一次文件,但会反复展开每一行,直到其中没有更多宏。所以首先它扩展'int a = digit'到'int a = one',然后它扩展到'int a = 1'。 – Barmar

+0

非常感谢您的帮助。 – Hairi

相关问题