Я портирую некоторый открытый исходный код, чтобы он мог основываться на другом компиляторе c ++.Одной из трудностей и тем, которые, похоже, продолжают появляться, являются различия в реализации предоставляемой стандартной библиотеки компилятором.
Например, один из исходных файлов, которые я компилирую, включает <sys/types.h>
.Однако, это дает мне следующие ошибки:
Error E2316 g:\Borland\BCC593\Include\sys/types.h 45: 'time_t' is not a member of 'std'
Error E2272 g:\Borland\BCC593\Include\sys/types.h 45: Identifier expected
Изучив основную причину этого, я обнаружил, что один из главных заголовков включения проекта включает <sys/types.h>
в этот шаблон:
project_source1.cpp:
#include "../TargetPlatform.h"
#include "project_config.h"
#include <windows.h>
namespace project_namespace {
#include "project_component/all.h"
// more project includes down here
// ...
}
project_component / all.h:
#ifndef INCLUDE_GUARDS
#define INCLUDE_GUARDS
#include <sys/types.h>
#include "project_header1.h"
#include "project_header2.h"
// and other headers etc..
// followed with class definitions and what not.
#endif
Это все хорошо, за исключением одной проблемы, <sys/types.h>
реализован примерно такэто для компилятора, который я портирую на:
<sys/types.h>
, урезанный до сути:
namespace std {
typedef long time_t;
typedef short dev_t;
typedef short ino_t;
typedef short mode_t;
typedef short nlink_t;
typedef int uid_t;
typedef int gid_t;
typedef long off_t;
} // std
using std::time_t;
using std::dev_t;
using std::ino_t;
using std::mode_t;
using std::nlink_t;
using std::uid_t;
using std::gid_t;
using std::off_t;
И это причина ошибки компиляции, которую я вижу.Поскольку проект включает <sys/types.h>
внутри своего собственного пространства имен, такие вещи, как time_t, off_t, dev_t и т. Д., Помещаются в область действия project_namespace::std::
, что явно не соответствует тому, что предполагалось.
Что такоелучший способ справиться с этим?Имейте в виду, что могут быть другие стандартные заголовки библиотек, определенные аналогичным образом, а не просто sys/types.h
.Существуют ли какие-либо идиомы С ++, которые имеют отношение или частично связаны с этой проблемой (или, возможно, даже расходятся с ней из-за способа, которым это реализовано)?Если да, то как это можно примирить?
Спасибо