Вариант проекта VC ++ 2005 для включения STL? - PullRequest
1 голос
/ 25 апреля 2009

Я работаю над кроссплатформенным проектом, который использует STL. Другой компилятор включает поддержку STL по умолчанию, но в VS2005 мне нужно добавить следующее перед определениями классов, которые используют элементы STL:

#include <cstdlib>
using namespace std;

Есть ли опция VS2005, которая установит это автоматически? Это немного утомительно, чтобы обойти. Я просто пытаюсь избежать большого количества #ifdefs в источнике -

РЕДАКТИРОВАТЬ: Другой компилятор является верстаком IAR для семейства ARM 926x. Возможно я должен заставить их явно делать включения?

Также - предпочтительнее "std :: map <>", используя пространство имен std; map <> "?

Ответы [ 4 ]

2 голосов
/ 25 апреля 2009

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

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

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

1 голос
/ 25 апреля 2009

Попробуйте сослаться на компоненты STL по их именам, определенным в пространстве имен (т.е. std :: vector).

Выполнение глобального 'использования пространства имен std' обычно является плохой идеей.

Или, может быть, я не понимаю вопроса.

0 голосов
/ 25 апреля 2009

В общем, вам следует избегать «использования пространства имен X», особенно в заголовочных файлах (потому что каждый, кто включает ваш заголовок, тоже получает это пространство имен, хочет он этого или нет), и особенно для пространства имен std (потому что оно настолько велико и потенциально для именных коллизий большое).

Вместо этого в заголовочных файлах обращайтесь к именам по их полной форме, например ::

// for plain functions
void foo(std::map<int> intMap);

// for classes
class person {
    std::string name_;
  public:
    person(std::string name);
    // ...
};

Затем в кодовых файлах вы можете делать «использование», но предпочитаете использовать определенные элементы в пространстве имен, а не вытягивать все пространство имен. e.g.:

using std::map;
using std::string;

void foo(map<int> intMap) { ... };
person::person(string name) : name_(name) { ... };

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

0 голосов
/ 25 апреля 2009

Компилятор IAR не поддерживает пространство имен std (я не уверен почему, потому что он вообще поддерживает пространства имен, если я правильно помню).

Если вы загляните в заголовки среды выполнения для IAR, то увидите, что они выполняют некоторые макро-гимнастики, чтобы обойти это (среда выполнения лицензирована у Dinkumware, которая предоставляет среды выполнения для довольно многих компиляторов).

Возможно, вам придется сделать что-то подобное, если вы хотите, чтобы ваши вещи работали в разных средах. Возможная более чистая альтернатива - просто включить директиву using namespace std;. Возможно, я ошибаюсь, но я думаю, что компилятор IAR по сути игнорировал это (он не возражал против того, что вы используете пространство имен, о котором он не знал). Многие люди сочтут это уродливым, но иногда вы должны делать то, что от вас требует компилятор.

...