Вопрос по #include <> в VS2005

durka82

Есть файл кода на C++, в котором есть инклюд вида:
#include <../src/sp_blas/include/sp_blaspc.h>  

Причем соотв файл (если брать от файла, в котором это написано) существует.
Однако при компиляции выдается сообщение
Error 1 fatal error C1083: Cannot open include file: '../src/sp_blas/include/sp_blaspc.h': No such file or directory c:\prj\pmlp_test\src\psp_blas\src\general.cpp 2

Корень проекта как раз "c:\prj\pmlp_test\".
Насколько я понимаю, мне надо где-то настроить, чтобы библиотеки искались и в "c:\prj\pmlp_test\".
Где это делается?

0000

пропятся проекта - С/C++ - генеральный - адитионал инкулуд директорис

stm8823636

project->properties->c/c++->general->additional include directories

stm8823636

ЫЫЫЫЫ

kokoc88

Причем соотв файл (если брать от файла, в котором это написано) существует.
Кажется, это берётся не от файла, где написано, а от корня проекта.

durka82

Всем спасибо за оперативность
А в какой переменной окружения это все хранится?
А то каждый раз захожу туда, а там поле пустое (хотя ошибки компиляции пропадают)
Еще такой вопрос: iostream.h - вроде бы системная библиотека, однако на нее компилятор тоже жалуется, что нет такого файла
И еще: где брать mpi.h? Надо что-то дополнительно ставить?

Maurog

попробуй <iostream> без расширения.
mpi.h это уже жопа для распараллеливания
гугли =)

durka82

Без расширения действительно помогло.
Только вот не может так быть, что в VS6 расширение было нужно, и нельзя ли поведение инклюда опцией изменить?
mpi.h нашелся в соседней папке - надо было еще одну подключить.
Насчет пустого поля - папку с корнем проекта в тот список студия почему-то не добавила, но соотв ошибки пропали - мб тоже где галочка есть...

evgen5555

iostream.h - это уже тыщу лет как deprecated-фича.

yolki

когда кажется - креститься надо
По стандарту:
если пишут #include <> то ищется в местах, определяемых компилятором
Если пишут #include "" то ищется способом, определяемым компилятором

//сцуко PDF копи-пэйст не даёт сделать

okunek

в местах, определяемых компилятором
так способ тоже должен существовать
способом, определяемым компилятором
так места-то тоже должны существовать

Maurog

а почему new-line присутствует в стандарте?
вроде инклюд работает и без new-line ? =)
или я путаю си и си++ ?

yolki

это требование для спецификации случаев, когда инклюд - последняя строка в файле. не все правильные текстовые редакторы заканчивают файл new-line

Maurog

наверное, я плохо выразился =(
не знаю, как лучше

durka82

Отвечу всем сразу:
Мне дали готовый проект разбираться, с чем его едят - надо будет кое-что под него дописать.
Проект большой и даже если я захочу его переписать, мне никто не даст - это все не мое.

iostream.h - это уже тыщу лет как deprecated-фича.
Я учту, но скорее всего в этом проекте это уже не будет меняться.

//сцуко PDF копи-пэйст не даёт сделать
А ты бы его файнридером

как это ты mpi нашел?
научи
Просто видимо все необходимые файлы для mpi уже включены в проект.

durka82


попробуй <iostream> без расширения.
Посмотрел мсдн по этому поводу - там примеры именно с расширением.
Мб где-то опция есть или еще что.
А то вариант замены во всех файлах не нравится, тем более, что не факт, что он правильный...

durka82

Поискал тот же самый iostream на диске и обнаружил, что соответствующие файлы не имеют расширения
Хотя есть хидеры и с расширением .h.
Уж не знаю, зачем так сделано.
Мб кто-нибудь знает быстрый способ, как можно подружить файлы с хидерами без расширения с указанием инклюда с расширением?
А то получается, что если с исходниками надо будет работать под VS6/под Линуксом, придется опять переделывать
Да и не хочется вносить изменения в файлы, которые поо логике трогаться вообще не должны.
Мб можно сделать что-то вроде файла мапинга?..

durka82

Еще непонятно, почему вдруг появились ошибки компиляции - например в строке
inline istream& operator >> (istream& istm, complex<PR>& ct)
выдается ошибка C2143: syntax error : missing ';' before '&' .
Мб есть какие тонкости при переносе кода с VS6 на VS2005?

kokoc88

namespace std:: ?

durka82

А куда это надо прописать?
В настройки проекта?

durka82

В общем этот проект под VS6 таки откомпилился.
Но тогда получается, что с VS2005 VS6 по С++ не то, чтобы совместим
Или есть конвертер проектов?

Maurog

внутри <iostream.h> уже прописано using namespace std;
а внутри <iostream> этого не сделано, поэтому нужно самому это написать.
действительно, чтобы перенести проект надо постараться
апдейт: я глюк

durka82


внутри <iostream.h> уже прописано using namespace std;
а внутри <iostream> этого не сделано, поэтому нужно самому это написать.

Так как исправить ситуацию?
Достаточно в основном файле (где main) в начале написать "using namespace std::"?
Не патчить же теперь хидеры все либ VS2005, которые используются в этом проекте
Или надо как-то иначе?

stm8823636

using namespace std;

durka82

Так куда его писать-то?

stm8823636

в тот контекст, где ты используешь методы или классы из пространства имен std.

durka82

То есть мне придется добавить их в каждый файл, где есть соотв инклюды?

Maurog

да.
но можно вписать эту строчку в самом конце iostream.h
(учитывая, что iostream.h - копия iostream)
=)

yolki

вообще говоря, да.
можно писать так:

#include <iostream>

int main
{
std::cout << "Hello, World!" << std::endl;
return 0;
}

а можно и вот так:

#include <iostream>

int main
{
using namespace std;
cout << "Hello, World!" << endl;
return 0;
}

durka82

В папке VS2005 есть только iostream - iostream.h там нету.
Но наверное можно их создать.
Правда такое не с одним iostream.h - там с десяток таких инклюдов.
Всем спасибо, попробую...

durka82

Имхо, это немного не то.
У меня ошибка связана с тем, что компилятор не может найти файл, заданный в инклюде.
Или твои примеры эквивалентны этому?
#include <iostream.h>

int main
{
using namespace std;
cout << "Hello, World!" << endl;
return 0;
}

Maurog

поставь себе VS6.
у тебя слишком много уйдет времени на конвертацию проекта. да и смысла в этом нет, потому что ты говоришь, что тебе не дадут менять проект, ибо он не твой.

Realist

А то получается, что если с исходниками надо будет работать под VS6/под Линуксом, придется опять переделывать

Небольший экскурс тут вроде еще не прозвучал. Раньше всякие С++ шняги типа сout лежали в хедерах
типа iostream.h, но потом решили, что cout и прочие стандартные плюсовые шняги будут лежать в пространстве std, а для их использования нужно включать iostream (без .h). Из соображений совместимости поддерживаются старые заголовки, в которых тот же cout лежит в глобальном пространстве имен. Пример содержательной части реального современного iostream.h
  
#ifndef _BACKWARD_IOSTREAM_H
#define _BACKWARD_IOSTREAM_H 1

#include "backward_warning.h"
#include <iostream>

using std::iostream;
using std::ostream;
using std::istream;
using std::ios;
using std::streambuf;

using std::cout;
using std::cin;
using std::cerr;
using std::clog;


Этот код выводит предупреждение во время компиляции, вставляет iostream и добавляет классы из него в глобальное пространство имен.
Проблема от того, очевидно, VS2005 отказалась от обратной совместимости.
Таким образом, если нормально проапдейтить проект, он будет собираться и в 6 студии, и в Линуксе.

durka82

поставь себе VS6.
Так я уже написал, что так решил проблему.
Но на перспективу интересно узнать, какие сложности могут возникнуть при переходе с VS6 на VS2005 и переносе проектов.
А то везде(в том числе и в этом форуме) пишут, что для С++ стоит переходить с VS6 на VS2005 - что это дает свои преимущества.
А теперь получается, что недостатки вполне могут переввесить достоинства

durka82

Ясно, спасибо, попробую пнуть авторов проекта - мб учтут
Оставить комментарий
Имя или ник:
Комментарий: