【问题标题】:How am I accessing the cpp standard library without placing '#include' statements?如何在不放置“#include”语句的情况下访问 cpp 标准库?
【发布时间】:2011-05-30 23:06:39
【问题描述】:

我一直在零星地从“加速 C++”中自学 cpp,最近我注意到,当我忘记了我的 #include <algorithm> 语句时,我的代码(包括 transform 和 find_if)无论如何都会编译并成功运行。在此之后,我尝试完全删除所有标准头包含语句,发现我的代码仍然运行。

我认为我无法理解预处理器命令将在我完成本书时得到解决,但现在我只需要知道如何确保当我不正确地制作标题时我的终端会对我大喊大叫,以便我可以学习东西在 std 库中的位置。

我运行的是 OS 10.6.5,所以我必须使用以下 unix exe 文件编译我的代码:

CC = g++
CFLAGS = -Wall
PROG = TrainingProject23

SRCS = TrainingProject23.cpp

ifeq ($(shell uname),Darwin)
    LIBS = -framework OpenGL -framework GLUT
else
    LIBS = -lglut
endif

all: $(PROG)

$(PROG):    $(SRCS)
    $(CC) $(CFLAGS) -o $(PROG) $(SRCS) $(LIBS)

clean:
    rm -f $(PROG)

它包括 OpenGL 的构建协议,因为我也在学习这一点,并且使用这个文件来编译我所有的 C++ 项目很容易。除了如何更改src文件和程序名称之外,我不太了解Makefile,我只是从互联网上得到的。

【问题讨论】:

  • 信息不足。我们需要 TrainingProject23.cpp
  • Hmm... TrainingProject23 只是一个我保持打开的文件,所以我不必对上面的 unix 文件进行太多修改(我可以在项目之间保持 SRCS = TrainingProjects23 相同)。我经常完全删除内容并重新开始尝试新的东西。我不再拥有这些内容,但我尝试过的每个代码都会产生相同的结果:无论是否包含必要的标准库节点,它都能成功运行和编译。

标签: c++ macos header include


【解决方案1】:

标准库头文件允许包含其他标准库头文件。所以如果你例如#include <string>;允许(但不要求)您的实现包含所有其他标准库头文件,包括<algorithm>。在你的情况下,这可能发生了,但你不应该依赖它。

【讨论】:

  • 在 C++ 中,这通常是正确的(例如,任何一个 C++ 标准头文件都可以拖入其他头文件)。在纯标准 C 中,情况并非如此;一个标准标头不允许拉入其他标头 - 除了一种特定的特殊情况:<inttypes.h> 可以包含<stdint.h>。在 POSIX 中,允许某些标头包含其他标头。
  • @Jonathan - 好点。不过,他也可以有非标准的标题。
  • 啊哈!我不知道这个!这绝对是问题所在。事实上,我很确定您提供的 示例正是我注意到它的场景。感谢所有评论的人!
【解决方案2】:

如果没有看到您的确切代码,很难确定,但一种可能的选择是您包含其他头文件(cmets 中的 Kristopher 猜测 OpenGL 和/或 GLUT),而这些头文件又包含您的代码没有的库明确包含。

例如

# File: my_incl.h
#include <algorithm>

# File: main.c
#include "my_incl.h"
# yay - you just included the algorithm.h without even trying. 

请注意,这是可行的,但依赖它是不好的做法,原因有很多:

  • 如果您的项目停止包含“my_incl.h”,它将突然停止编译,没有 100% 立即明显的原因。

  • 它使代码更难阅读/理解,因为包含列表可让您快速总结代码使用了哪些库。

  • 只是马虎

【讨论】:

  • 顺便说一句,这通常用于打高尔夫球:包含一个带有短名称的标题,其中包含我们感兴趣的标题。
  • 对此进行扩展:您可能包含 OpenGL 和/或 GLUT 头文件,它们可能包含标准库头文件。
  • @marcog - 我在 C 语言(而不是 Perl)中打高尔夫球的日子已经过去了,但是要知道的好建议,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 2021-03-04
  • 1970-01-01
  • 1970-01-01
  • 2011-11-04
  • 1970-01-01
相关资源
最近更新 更多