Не удается правильно включить заголовочные файлы - PullRequest
2 голосов
/ 29 июля 2011

У меня проблема с добавлением некоторых включений

#include <stdio.h>
#include <unordered_map>
#include <mysql.h>

Используя эту команду для компиляции,

g++ -Wl,-Bsymbolic-functions -rdynamic -L/usr/lib/mysql -lmysqlclient -I/usr/include/mysql -DBIG_JOINS=1 -fno-strict-aliasing -DUNIV_LINUX -DUNIV_LINUX -I/usr/include/ -I/usr/include/c++/4.5/bits/ main.c -o program

Когда я удаляю .h в MySQL и stdio, он говорит, что не может их найти, но он работает и находит в unordered_map. Wtf

Ответы [ 4 ]

1 голос
/ 29 июля 2011

Начиная с возраста C, большинство заголовков имеют расширение, обычно равное .h, и они напрямую соответствуют файлам в системе. В C ++ стандарт явно определяет определенные библиотечные компоненты как имеющие директивы include, не включающие в себя никаких расширений, например <unordered_map>. Эти библиотечные включения даже не обязаны соответствовать файлу, просто они предоставляют требуемый интерфейс, когда включены. Напротив, mysql.h и stdio.h и реальные файлы, которые должны быть включены под точным именем.

В случае stdio.h библиотека C ++ определяет include <cstdio>, который включает в себя все функции C stdio.h, но помещает их в пространство имен std вместо global (что было единственным вариантом в C) .

1 голос
/ 29 июля 2011

Некоторые заголовки стандартных библиотек названы, например, "string", "vector" и т. Д. Вы найдете файл "unordered_map" в вашем включаемом каталоге, но вы не найдете файл "mysql", только "mysql.h".

0 голосов
/ 29 июля 2011

C ++ опускает ".h" из своих системных заголовочных файлов, чтобы отличать их от заголовочных файлов C. Подробно здесь в разделе «Заголовки C ++ для стандартной библиотеки C»

0 голосов
/ 29 июля 2011

Расширение имени файла не является обязательным!Причина, по которой вы можете сказать

#include <unordered_map>

вместо

#include <unordered_map.h>

, заключается в том, что файл на самом деле называется "unordered_map", без расширения.

C ++ действительно имеет *Заголовок 1009 *, который оборачивает C * stdio.h, так что вы можете включить его вместо этого;но что касается MySql.h, я не знаю, отправят ли они такую ​​замену.

...