2011-04-05 50 views
0

我正在学习C并希望有人能解释使用#ifndef的逻辑是什么?使用预处理器的提示#ifndef

我也看到很多我看过的C程序,人们似乎遵循#ifndef#define#endif之后的文件名。有没有关于如何选择这个名字的规则或提示?

#ifndef BITSTREAM_H 
#define BITSTREAM_H 

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

/*Some functions*/ 

#endif 
+0

[C#头文件的最佳做法#ifndef #define #endif]的可能重复(http://stackoverflow.com/questions/2939368/best-practice-on-c-header-files-with-ifndef -define-endif) – nos 2011-04-05 19:16:42

回答

1

您要查找的术语是预处理器指令。

#ifndef不需要跟一个文件名,例如,它经常可以看到#ifdef WINDOWS#ifndef WINDOWS

+0

哦,我明白了。感谢David Heffernan,为我添加了逃生。跳过了 – tamarintech 2011-04-05 18:40:39

0
#ifndef

装置“如果没有定义”。它通常用于避免文件的多个include

5

头文件通常会使用这样的逻辑来避免多次包含 。源文件第一次包含它们时,名称 未定义,因此它被定义并完成其他事情。 随后的时间,名称被定义,所以所有被跳过。

+0

,但仍按词法分析。 – lhf 2011-04-05 19:01:39

+0

当然,它还能找到'#endif'吗? – 2011-04-05 19:06:45

+0

如果有'#endinput'指令,它可能会不同(像在TeX中)。然后你可以编写'#ifdef BITSTREAM_H #endinput#endif'(每行当然有一个指令)。 – lhf 2011-04-05 22:07:54

-1

Tom Zych:“头文件通常会使用这样的逻辑来避免被多次包含。”

这是真的,但它确实只对“公共”标题是必需的,比如库函数的标题,在这里你不能控制标题的包含方式。

这个技巧对于项目中使用的标题是不必要的,这些标题可以控制项目的包含方式。 (如果公共标题之外有它们的用途,这不是常见的)。

如果您避免在“私人”标题中使用它们,那么您将更有可能以较不随意的方式包含标题。