Как я могу получить доступ к стандартной библиотеке cpp без размещения операторов '#include'? - PullRequest
4 голосов
/ 27 декабря 2010

Я спорадически обучал себя cpp из «ускоренного C ++», и недавно я заметил, что когда я забыл свое утверждение #include <algorithm>, мой код (который включает transform и find_if) скомпилирован и в любом случае успешно выполняется.После этого я попытался удалить все стандартные операторы include заголовка и обнаружил, что мой код все еще работает.

Я предполагаю, что моя неспособность понять команды препроцессора будет решена к тому времени, когда я закончу книгу, но сейчас мне просто нужно знать, как убедиться, что мой терминал кричит на меня, когда я делаю заголовок неправильно, такЯ могу узнать, где что находится в библиотеке std.

Я использую ОС 10.6.5, поэтому мне нужно скомпилировать мой код с помощью следующего exe-файла unix:

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 ++.Я не очень понимаю Makefile, кроме того, как изменить файл src и имя программы, я только что получил его из интернета.

Ответы [ 2 ]

5 голосов
/ 27 декабря 2010

Стандартные заголовки библиотеки могут включать другие стандартные заголовки библиотеки.Так что если вы, например, #include <string>;вашей реализации разрешено (но не обязательно) включать все остальные стандартные заголовки библиотеки, включая <algorithm>.В вашем случае это, вероятно, произошло, но на это не стоит полагаться.

5 голосов
/ 27 декабря 2010

Трудно понять наверняка, не видя вашего точного кода, но один из возможных вариантов заключается в том, что вы включаете другие заголовочные файлы (Кристофер в комментариях предполагает 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% очевидной причины.

  • Это затруднит чтение / понимание кода, поскольку списоквключает в себя краткую сводку о том, какие библиотеки используются вашим кодом.

  • Это просто небрежно

...