string.h и <string> - PullRequest
       17

string.h и <string>

0 голосов
/ 28 февраля 2012

Я пытаюсь собрать библиотеку в устаревшем проекте C ++.Платформа является power-pc с использованием компилятора gcc.

Компилятор выдает ошибки сборки, подобные этим: error: string: Нет такого файла или каталога или error: vector: Нет такихфайл или каталог.

  • Насколько я понимаю, он не может найти стандартную библиотеку.Где обычно находятся стандартные файлы библиотеки и в каком формате?Это * .h или какой-то другой?Я искал это в интернете, но не думаю, что полностью его понимаю.

  • Запутанная часть заключается в том, что другая библиотека в том же проекте, использующая тот же файл исходного кода, прекрасно скомпилирована.Это наводит меня на мысль о том, что make-файлы для этих двух проектов различны: один может найти стандартную библиотеку, а другой нет.Но быстрое сравнение ч / б не выявило никаких явных различий.Любые другие мысли по этому поводу, пожалуйста?

  • Наконец, я только что узнал, что string.h для строк в стиле c, а string для C ++ std lib.Можно ли смешивать их, то есть исходный файл имеет #include string.h, а также неявно #include string, включая какой-то другой файл?Я спрашиваю, потому что это та же самая ситуация в файле, который не создается.

Спасибо.

Сообщение об ошибке:

Компиляция SOURCE_FILE.cpp

В файле, включенном из SOURCE_FILE.cpp: 3:

HDR_FILE.h: 1: ошибка: строка: Нет такого файла или каталога

HDR_FILE.h: 2: ошибка:вектор: Нет такого файла или каталога

КОД В SOURCE_FILE.cpp

#include <stdlib.h>
#include <string.h>
#include "fileABC.h"

using namespace std;

// Other code

КОД В HRD_FILE.h

#include <string>
#include <vector>
#include <hdr.h>
#include <hdr-cseq.h>
//... OTHER FILES ETC.

Ответы [ 2 ]

5 голосов
/ 29 февраля 2012

Если файлы не определяются как исходный код C ++, вы можете получить ошибки, подобные этой. Названы ли файлы c ++ с соответствующим расширением файла?

cat test.c

#include <vector>
int main() {}

gcc test.c

test.c:1:18: error: vector: No such file or directory

Команда выше скомпилирует код на C, но не на C ++. Помните, что это два разных языка. Для сборки программ на C ++ вы должны сообщить компилятору, что источником является C ++, так или иначе. Если вы используете g ++, он будет автоматически предполагать, что файлы с расширениями '.c' являются C ++ (по крайней мере, моя версия это делает. Или вы можете указать компилятору использовать C ++, передав -x c++ непосредственно перед передачей файла. Вы также должны указать компоновщик для включения библиотеки C ++. g ++ также делает это автоматически, или вы можете передать флаг компоновщика -lstdc++.

Сложный путь:

gcc -x c ++ test.c -lstdc ++

Простой способ:

g ++ test.c

В ответ на ваш последний вопрос вы можете свободно смешивать <string.h> и <string> (хотя вам, вероятно, следует использовать <cstring> вместо <string.h>).

1 голос
/ 29 февраля 2012

Строка языка C отличается от C ++ std :: string.

Строковый тип языка C представляет собой последовательность символов, оканчивающихся на ноль, ноль, символ '\ 0'. Объявления функций для управления этой структурой данных находятся в <string.h> or <cstring>, в зависимости от того, компилируете ли вы как C или C ++, соответственно.

Тип C ++ std :: string является контейнером символов. Реальная реализация может варьироваться в зависимости от компилятора, но интерфейс не будет. Методы std :: string объявлены в <string>. Компилятор должен быть настроен для компиляции на языке C ++.

C ++ std :: string имеет методы для генерации строк языка C, а также для создания строк C ++ из строк стиля языка C. Для получения дополнительной информации ознакомьтесь со Стандартной библиотекой шаблонов.

Также поищите в Интернете «C ++ FAQ». Это обязательное чтение перед программированием на языке C ++. Существует также часто задаваемые вопросы для языка C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...