Visual c++ 独立于编译器的C++;代码

Visual c++ 独立于编译器的C++;代码,visual-c++,g++,Visual C++,G++,在大学里,我必须通过“计算机科学概论”课程。在这门课上,他们会给你不同的练习,你必须用汇编,C,C++ + < /P>来解决。 我的问题是,我使用不同的编译器(g++和Visual Studio C++),但它们对我给它们的代码进行不同的解释,或者需要不同的代码,因此我必须至少实现两次我的程序 我正在寻找信息,我可以编写代码,这些代码将在GCC和VisualStudioC++中工作。 我已经处理过的一些例子: 在VSC++上工作: template<typename T, template

在大学里,我必须通过“计算机科学概论”课程。在这门课上,他们会给你不同的练习,你必须用汇编,C,C++ + < /P>来解决。 我的问题是,我使用不同的编译器(g++和Visual Studio C++),但它们对我给它们的代码进行不同的解释,或者需要不同的代码,因此我必须至少实现两次我的程序

我正在寻找信息,我可以编写代码,这些代码将在GCC和VisualStudioC++中工作。 我已经处理过的一些例子:

在VSC++上工作:

template<typename T, template<typename X, typename Y> class container, class Allocator>
int in(int p_number, va_list params){
std::ifstream &data = *(va_arg(params, std::ifstream*));
if(!data.good()){
    return -1;
}

char delimiter = (char)va_arg(params, int), temp;
std::stringstream ss;
while((temp = data.get())!=delimiter){
    if(data.eof()){
        return 0;
    }
    ss.put(temp);
}
T value;
ss >> value;

if(data.eof()){
    return 0;
}

typedef container<T, Allocator>* con_p;

container<T, Allocator> &con = *(va_arg(params, con_p));
con.push_back(value);

return 1;
}

template<typename T>
struct MAP{
template<typename itr>
static int map(itr begin, itr end, int (*fp)(int, va_list), int p_number, ...){
    int p_number2 = p_number+1;

    va_list list;
    va_start(list, fp);

    int r=0, temp;
    for(; begin!=end; ++begin){
        p_number = reinterpret_cast<int>(&(*begin));
        temp = (*fp)(p_number2, list);
        if(temp==-1){
            return -1;
        }
        r += temp;
    }

    va_end(list);

    return r;
}
};

template<typename T,
        template<typename X, typename Y> class container,
        class Allocator>
int write(const container<T, Allocator> &con, std::string filepath, char delimiter = '\n'){
std::ofstream data;
data.open(filepath, std::ios::out | std::ios::binary | std::ios::trunc);
int r = MAP<T>::map(con.begin(), con.end(), out<T>, 2, &data, delimiter);
data.close();
return r;
}
模板
int in(int p_编号,va_列表参数){
std::ifstream&data=*(va_arg(params,std::ifstream*);
如果(!data.good()){
返回-1;
}
字符分隔符=(字符)va_arg(参数,int),temp;
std::stringstream-ss;
while((temp=data.get())!=分隔符){
if(data.eof()){
返回0;
}
ss.put(温度);
}
T值;
ss>>价值;
if(data.eof()){
返回0;
}
类型定义容器*CONU p;
容器&con=*(va_arg(参数,con_p));
con.推回(值);
返回1;
}
模板
结构图{
模板
静态int映射(itr开始、itr结束、int(*fp)(int、va_列表)、int p_编号,…){
int p_编号2=p_编号+1;
va_列表;
va_启动(列表,fp);
int r=0,温度;
for(;begin!=end;++begin){
p_编号=重新解释铸件(&(*开始));
温度=(*fp)(p_编号2,列表);
如果(温度==-1){
返回-1;
}
r+=温度;
}
va_end(列表);
返回r;
}
};
模板
int write(常量容器和con,std::字符串文件路径,字符分隔符='\n'){
流数据的std::;
打开(文件路径,std::ios::out | std::ios::binary | std::ios::trunc);
int r=MAP::MAP(con.begin(),con.end(),out,2,&数据,分隔符);
data.close();
返回r;
}

在g++中工作:

template<typename T, class A, template<typename X, typename Y> class container>
int write(const container<T, A> &con, std::string filepath, char delimiter = '\n'){
long temp; int r = 0;
std::ofstream data;
data.open(filepath.c_str(), std::ios::out | std::ios::binary | std::ios::trunc);

for(typename container<T, A>::const_iterator i=con.begin(); i!=con.end(); ++i){
    if(!data.good()){
        data.close();
        return -1;
    }

    temp = (long)data.tellp();
    data << *i << delimiter;

    r += ((long)data.tellp() - temp);
}

data.close();
return r;
}
模板
int write(常量容器和con,std::字符串文件路径,字符分隔符='\n'){
长温度;int r=0;
流数据的std::;
打开(filepath.c_str(),std::ios::out | std::ios::binary | std::ios::trunc);
对于(typename容器::常量迭代器i=con.begin();i!=con.end();++i){
如果(!data.good()){
data.close();
返回-1;
}
temp=(长)data.tellp();

data每当遇到这种情况时,都意味着您的代码可能是错误的。编译器应该正确处理正确的代码。因此,始终检查您是否做出了不可移植的假设,或者甚至存在更宽容的编译器会接受的错误

话虽如此,一般来说,当您想要为不同的平台进行编译时,您可以使用条件编译块;也就是说,您可以将代码封装在

#ifdef PLATFORM_MACRO
    // conditional code here
#endif

其中PLATFORM#MACRO是为相关平台设置的#define。该块中的代码将仅由所需平台看到(即:定义了PLATFORM#MACRO的位置).

您是否检查了编译器消息?产生错误消息是有原因的。对于我来说,
gcc
在包含适当的头(
等)并更正类型(例如
数据.open(filepath.c_str(),…
而不是
数据.open(filepath,
等)后,将编译第一个示例.

类似地,第二个示例似乎在VC++(几个版本)中编译并运行得很好。