C语言中可用的通用头文件

3

我刚接触C语言,想知道是否有一个通用的头文件可以在主函数顶部包含。在Java中,只需在eclipse中按ctrl+shift+o即可为您导入包。但是在C语言中,我每次都要搜索并添加它。有时候,我甚至不知道应该包含哪个库。


1
Java并不是让你的生活变得更轻松的原因,而是Eclipse。Java同样会抱怨你没有导入某些东西,却不告诉你具体是什么。你可能想要一个像Eclipse对Java那样对C也有帮助的IDE。 - paxdiablo
7个回答

3

没有一个头文件是包罗万象的。

无论如何,在MS Windows上这样的头文件对于Unix来说都是错误的,而在Unix上这样的头文件对于Windows来说也是错误的。即使在Unix上,通用头文件是否应该包括所有X11头文件? OpenSSL头文件呢? POSIX线程头文件呢?其他POSIX头文件呢?

你需要学会去哪里查找你需要使用的任何函数的信息。在Unix上,经典资源是“man页面”(意思是“手册页面”,通常使用“-man” troff/nroff宏包进行格式化)。如今,我倾向于使用网络:例如,我发现 The Open Group 的POSIX man页面。

(请注意,头文件与库文件是分开的;单个库中的函数可能会使用许多头文件。通过标准C库进行说明。)


顺便提一句,Debian、Ubuntu和其他衍生系统都有manpages-posixmanpages-posix-dev软件包中的POSIX手册页——这使得比较man 3 pthread_cancelman 3posix pthread_cancel变得非常容易。我很喜欢同时拥有两个版本的手册。 - sarnold

3

没有通用的头文件,但您可以为您的应用程序制作一个,并将其包含在所有文件中。如果您不确定需要调用哪个文件来运行某个函数,可以在UNIX上使用man命令。例如:

man 3 printf

展示如下:

SYNOPSIS

#include <stdio.h>

int printf(const char * restrict format, ...);
如果您花足够的时间与之共处,通常会相对迅速地记住函数与标题的“映射关系”。

1
你只能在Linux或基于GNU的系统上使用man printf -s 3(仅当您未在环境中设置POSIXLY_CORRECT时)。所有明智的地方都要求在参数(如printf)之前使用诸如-s 3的选项,以实现可移植性,因此需要使用man -s 3 printf。但是,我记得有些系统不支持-s 3表示法,有时最好使用man 3 printf表示法。话虽如此,我并没有立即想到这样的系统的例子;可能随着最近版本的发布,情况已经发生了变化,我只是记得很久以前的小问题。 - Jonathan Leffler
@JonathanLeffler 很有趣!多年来我一直在我的Mac上使用这种语法,却不知道更短的“man 3 printf”表示法。谢谢! - Sergey Kalinichenko
引导问题... 'printf' - 不是最明显的名称。'calloc','strcmp' - 也不好。 - GoZoner

3

由于解析每个头文件需要时间,而可用的头文件数量为数千(如果不是数百万),因此没有通用的头文件。您也不希望这样做,因为其中99.9%将不会被使用,并且只会通过静态分配不必要地膨胀最终的可执行文件。

每个标准化函数都会在其手册页顶部告诉您需要包含哪些头文件。例如,从malloc(3)

NAME
   calloc, malloc, free, realloc - Allocate and free dynamic
   memory

SYNOPSIS
   #include <stdlib.h>

   void *calloc(size_t nmemb, size_t size);
   void *malloc(size_t size);
   void free(void *ptr);
   void *realloc(void *ptr, size_t size);

因此,您需要在项目中包含#include <stdlib.h>,这里有原型供您查看。
如果您想快速查看manpages,可以配置IDE快速显示它们。在vim中,默认的键绑定为K,用于加载光标下函数的manpage -- 但是,由于它使用默认的manpage搜索顺序,有时会找到错误的页面。(例如,在printf上,它加载printf(1)而不是printf(3)。很烦人。如果您希望更改此行为以先显示3而不是1,则可以使用man(1)中描述的MANSECT环境变量。)

1

不行。

我想你可能可以创建一个,但是那会大大减慢编译速度。一些集成开发环境可能会帮助你找到包含文件。


1

你可以让Eclipse自动插入你经常使用的各种头文件。但是:如果你想学习C语言,我建议你做一些工作去找出应该包含哪些头文件。

这就像所有学习一样,通过实践学习 - 通过重复学习。

标准的C库并不是非常庞大 - 头文件的命名直觉明了,并且具有可管理的标准函数列表。

准备一个类似this的列表并阅读它。需要include等时再去阅读它。

当你真正知道何时以及如何包含头文件时,请将其自动化。


1

你正在引用头文件,是因为你正在使用在头文件中定义的接口;而不是因为有一个标准设置要包含。那么,如何确定你需要哪个接口呢?有两个基本选项:

  1. 查找头文件或头文件的描述,并浏览它们以了解接口,或者
  2. 使用“适当的搜索词”或“man接口函数”。

作为初学者,选项#1将是一个好的开始-查找/usr/include或找到一本名为“C标准库”的书(或类似书籍)。


学习如何编写头文件时要小心,不要只从/usr/include中的材料中学习。这些头文件通常包含多年和多个标准版本累积的许多垃圾,并试图处理它们。为此,它们很少是清晰的模型;它们通常是最复杂和不透明的#ifdef#define的鼠窝之一。话虽如此,它们是查找特定函数是否定义以及如何定义的地方;但并不总是从第一(或第二,有时是第一百)次看到使用哪个定义。 - Jonathan Leffler

0
一个好的参考手册(例如this one)将会有一个附录列出所有库函数及其相关的头文件。您也可以查看在线C语言标准,第7章中有类似的列表。

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