如何在不放置"#include"语句的情况下访问cpp标准库?

hed*_*der 4 c++ macos header include

我一直在用'加速C++'教自己cpp,最近我注意到当我忘记了我的#include <algorithm>语句时,我的代码(包括transform和find_if)编译并成功运行.在此之后,我尝试完全删除所有标准的header include语句,并发现我的代码仍然运行.

我假设我无法理解预处理器命令将在我完成本书时解决,但是现在我只需要知道如何确保当我不正确地使用标题时我的终端对我大喊大叫所以我可以知道事情是什么位于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)
Run Code Online (Sandbox Code Playgroud)

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

DVK*_*DVK 5

如果没有看到确切的代码,很难确定,但一个可能的选择是你要包含其他头文件(评论中的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. 
Run Code Online (Sandbox Code Playgroud)

请注意,这有效,但依赖于它是不良做法,原因有多种:

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

  • 它使代码更难以阅读/理解,因为包含列表允许您快速汇总代码使用的库.

  • 这只是邋.的


eta*_*ion 5

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

  • 在C++中,这通常是正确的(如在任何一个C++标准头中可以拖动其他标头).在纯标准C中,情况并非如此; 一个标准的标题不允许引入其他标题 - 除了一个特定的特殊情况:`<inttypes.h>`可以包含`<stdint.h>`.在POSIX中,允许一些标题包含其他标题. (2认同)