在c头文件中使用define

时间:2017-01-31 02:51:09

标签: c constants header-files

我刚刚开始学习C,所以希望这不是一个愚蠢的问题。我遇到的问题是关于头文件和使用#define的常量。我已经读过,我应该使用以下内容来防止我的标题被多次编译。

#ifndef NAME_OF_FILE
#define NAME_OF_FILE
.
. //my header file content
.
#endif

我想添加一个常量,我相信我也会使用#define,例如,

#ifndef NAME_OF_FILE
#define NAME_OF_FILE

#define NUM_CONST 5 //the constant I want in my header file
.
.
.
#endif

C如何知道#define NAME_OF_FILE是指.h文件而#define NUM_CONST 5只是一个常量?是因为NUM_CONST末尾的值?或者我完全错了吗?

4 个答案:

答案 0 :(得分:4)

两个定义之间没有本质区别。 #define NAME_OF_FILE#define NUM_CONST 5属于同一类。他们定义了令牌的明文替换(在第一种情况下,替换是什么都没有)。

例如,您可以放置​​后续代码:

printf("%d\n", NAME_OF_FILE NUM_CONST NAME_OF_FILE);

在上述替换之后,代码将转入:

printf("%d\n", 5);

这是正确的。没有“魔力”。执行这些替换的编译步骤通常称为“预处理”。

NAME_OF_FILE本身并未引用.h文件,但使用ifndef指令实现了不编译相同代码两次的目标。

答案 1 :(得分:4)

没有。 NAME_OF_FILE可以是任何东西。你可能有

#ifndef PRETTY_PINK_PRINCESS
#define PRETTY_PINK_PRINCESS
/* definitions */
#endif

它也会起作用。使用NAME_OF_FILE只是一种惯例,因为它使它很可能是唯一的。

答案 2 :(得分:3)

#define IDENTIFIER定义了#ifdef的清单的标识符,但是的定义是空字符串。

所以,

#define NAME_OF_FILE

int main()
{
    int x = NAME_OF_FILE;
}

会解决

int main()
{
    int x = ;
}

所以没有涉及“知道”,只是一个定义但空洞的。

(这就是为什么某些风格指南会推荐#define NAME_OF_FILE NAME_OF_FILE,以便在NAME_OF_FILE 发生以在源中使用时,它会被替换为自我预处理器。)

答案 3 :(得分:0)

对于编译器,这两个语句都是宏

的类型
#define NAME_OF_FILE

#define NUM_CONST 5

这个构造

#ifndef NAME_OF_FILE
#define NAME_OF_FILE
.
. //my header file content
.
#endif

正在做,是第一次处理标题,marco" NAME_OF_FILE"没有定义,因此它被定义并处理整个头文件内容。第二次编译器出现这种情况,因为标题不止一次包含在项目中,是现在定义了marco并且头文件没有再次处理。 再次," c-code"不知道,例如marco __TEST_H有它,因为头文件的名称是' test.h'。您正在考虑的是,您的IDE自动生成了marco,然后您创建了头文件,并且IDE在文件之后调用了marco以方便用户。就像另一个人已经说过的那样,你可以重命名marco(在整个项目中将其重命名为我的意思)并且代码将编译并且通常与之前完全一样。