1

在大学里,我必须通过“计算机科学导论”课程。在本课程中,他们会为您提供有关各种主题的不同练习,您必须使用汇编、c、c++ 来解决这些问题。

我的问题是,我正在使用不同的编译器(g++ 和 Visual Studio C++),但是它们解释我给它们的代码不同或需要不同的代码,所以我必须至少实现我的程序两次!

我正在寻找信息,我如何编写适用于 gcc 和 Visual Studio C++ 的代码。

我已经处理的一些例子:

在 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;
}

在 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;
}

相同的功能,但非常不同的实现,因为 VSC++ 接受的模板定义不被 g++ 接受。

PS仅以防万一,如果我的大学正在搜索互联网以找出答案,如果他们的学生正在从互联网上复制他们的作业。我的名字是 TU-Darmstadt 的 Christian W. 学生。

4

2 回答 2

1

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

话虽如此,一般来说,当你想为不同的平台做编译时,你会使用条件编译块;也就是说,您将代码包含在

#ifdef PLATFORM_MACRO
    // conditional code here
#endif

其中 PLATFORM_MACRO 是为相关平台设置的#define。然后,该块中的代码将只能被所需的平台看到(即:定义 PLATFORM_MACRO 的地方)。

于 2012-11-28T21:53:59.403 回答
1

您检查过编译器消息吗?产生错误消息是有原因的。对我来说gcc,一旦包含适当的标题(等)并纠正类型(例如,而不是等) <cstdio>,就会编译第一个示例。<iostream>data.open(filepath.c_str(), ...data.open(filepath, ...

于 2012-11-28T22:18:06.163 回答