函数声明文件中需要 C 头指令吗?
C header directive needed in function declaration file?
我正在探索C编程语言,开始学习头文件。
我在我的程序中使用三个不同的文件。一个头文件和两个源文件:
encrypt.h
void encrypt(char *message);
encrypt.c
#include "encrypt.h"
void encrypt(char *message)
{
while(*message)
{
*message = *message ^ 31;
message++;
}
}
main.c
#include <stdio.h>
#include "encrypt.h"
int main()
{
char myMessage[] = "Hello";
printf("Regular message: %s\n", myMessage);
encrypt(myMessage);
printf("Encrypted message: %s\n", myMessage);
return 0;
}
encrypt.c 文件的第一行是#include 语句:
#include "encrypt.h"
我的问题是为什么此文件中需要这一行。我正在阅读 #include 指令如何具有 copy/paste 功能,并且在 main.c 文件内部我可以看到这种方法如何支持加密函数的前向声明;但是,在 encrypt.c 文件中,似乎不需要函数的前向声明,并且想知道在这种情况下使用 include 指令的目的是什么?
如果这个问题在其他地方被问过,我深表歉意,并将根据需要标记为重复。谢谢你的澄清。
在您的特定情况下,不是 encrypt.c
必须包含 encrypt.h
,但这样做是惯例。
头文件的正常用途是为可在多个源文件之间共享的声明提供一个公共位置。这样可以避免程序不同部分的声明不一致,当需要进行更改时,可能会减少需要更新的文件数量。
encrypt.c
不需要包含encrypt.h
,因为后者只包含一个函数声明encrypt()
,而encrypt.c
已经有一个[= =29=]那个函数的定义。尽管如此,它还是很有用的,因为它允许编译器验证 encrypt.h
中的声明是否与 encrypt.c
中的定义一致。
如果encrypt.c
定义了更多的函数,并且encrypt.h
为所有函数提供了声明,那么它也可以服务于encrypt.c
以确保其中所有函数的声明对其中的所有功能,从而克服了对实际定义的相对顺序的任何依赖。
旁注:
当你添加一个调用 encrypt()
函数的新源文件 fancy_encrypt.c
时,你必须在 encrypt.h
中有一个 compile guard文件:
#ifndef ENCRYPT_H
#define ENCRYPT.H
void encrypt(char * message);
#endif
否则你会因为 encrypt()
.
的多重声明而得到一个编译器错误
我正在探索C编程语言,开始学习头文件。
我在我的程序中使用三个不同的文件。一个头文件和两个源文件:
encrypt.h
void encrypt(char *message);
encrypt.c
#include "encrypt.h"
void encrypt(char *message)
{
while(*message)
{
*message = *message ^ 31;
message++;
}
}
main.c
#include <stdio.h>
#include "encrypt.h"
int main()
{
char myMessage[] = "Hello";
printf("Regular message: %s\n", myMessage);
encrypt(myMessage);
printf("Encrypted message: %s\n", myMessage);
return 0;
}
encrypt.c 文件的第一行是#include 语句:
#include "encrypt.h"
我的问题是为什么此文件中需要这一行。我正在阅读 #include 指令如何具有 copy/paste 功能,并且在 main.c 文件内部我可以看到这种方法如何支持加密函数的前向声明;但是,在 encrypt.c 文件中,似乎不需要函数的前向声明,并且想知道在这种情况下使用 include 指令的目的是什么?
如果这个问题在其他地方被问过,我深表歉意,并将根据需要标记为重复。谢谢你的澄清。
在您的特定情况下,不是 encrypt.c
必须包含 encrypt.h
,但这样做是惯例。
头文件的正常用途是为可在多个源文件之间共享的声明提供一个公共位置。这样可以避免程序不同部分的声明不一致,当需要进行更改时,可能会减少需要更新的文件数量。
encrypt.c
不需要包含encrypt.h
,因为后者只包含一个函数声明encrypt()
,而encrypt.c
已经有一个[= =29=]那个函数的定义。尽管如此,它还是很有用的,因为它允许编译器验证 encrypt.h
中的声明是否与 encrypt.c
中的定义一致。
如果encrypt.c
定义了更多的函数,并且encrypt.h
为所有函数提供了声明,那么它也可以服务于encrypt.c
以确保其中所有函数的声明对其中的所有功能,从而克服了对实际定义的相对顺序的任何依赖。
旁注:
当你添加一个调用 encrypt()
函数的新源文件 fancy_encrypt.c
时,你必须在 encrypt.h
中有一个 compile guard文件:
#ifndef ENCRYPT_H
#define ENCRYPT.H
void encrypt(char * message);
#endif
否则你会因为 encrypt()
.