如何在C语言中创建自己的头文件?

3
我尝试制作自己的头文件,但它并不起作用,vim 提示错误。
wget.h:2:2: error: invalid preprocessing directive #ifndef__WGET_H__
wget.h:3:2: error: invalid preprocessing directive #define__WGET_H__
wget.h:7:2: error: #endif without #if

我的代码是这样的:

//wget header file
#ifndef__WGET_H__
#define__WGET_H__

int my_wget (char web_address[]);

#endif /*__WGET_H__*/

对我来说看起来没问题(我读过的例子和我的很相似),但我不知道出了什么问题。有什么想法吗?


2
你需要在符号名称(例如 #ifndef)和标记之间加上一个空格,以定义/检查该符号。 - Joe
正如其他人指出的那样,您缺少一个空格,请将符号从__WGET_H__更改为WGET_H_。标识符中的任何双下划线,或者以下划线开头后跟大写字符的标识符都被实现保留。您的符号违反了这两个规则。 - Praetorian
@Praetorian “标识符中的双下划线”——这在C++中是正确的,但在C语言中不是。在C语言中,“所有以下划线开头且后跟大写字母或其他下划线的标识符都被保留供任何用途使用。 所有以下划线开头的标识符都被保留为普通和标记名称空间中具有文件作用域的标识符。” - Jim Balter
4个回答

2

在预处理器关键字和标签之间必须留出一个空格:

#ifndef __WGET_H__
#define __WGET_H__

1

更改:

#ifndef__WGET_H__
#define__WGET_H__

#ifndef __WGET_H__
#define __WGET_H__

(注意#ifndef__WGET_H__之间的空格)

1

一切都正确,只是缺少了空格。

#ifndef __WGET_H__
#define __WGET_H__

int my_wget (char web_address[]);

#endif __WGET_H__

通常情况下,您会在头文件中使用上述代码,因为如果您在项目中(无意中)多次包含相同的头文件,则编写此类头文件将确保仅包含一次头文件。


这与偶然事件无关。如果 a.h 和 b.h 都包含 c.h,则在同一文件中包含 a.h 和 b.h 将使 c.h 被重复包含。这在实际项目代码中非常常见。(事实上,即使在单文件程序中也会发生这种情况,因为系统头文件经常会包含其他系统头文件。) - Jim Balter
@JimBalter,是的,我完全同意你的观点,但有时候我会不小心多做一些。 - Barath Ravikumar

0

在编写预处理器关键字(例如#define)和标签(即__WGET_H__)之间需要留出空格。换句话说:

#ifndef __WGET_H__
#define __WGET_H__

会起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接