Мой C ++ компилируется в Clang, но не в GCC

Я пишу виртуальную машину на C ++, и она компилируется в Clang, но она просто выдает множество ошибок, когда я компилирую ее в GCC. Кто-нибудь может сказать мне, почему? Я не вижу, как мой код будет компилироваться в одном компиляторе, но он не будет компилироваться в другом компиляторе. Должны ли они теперь быть одинаковыми?

Вот код:

#include <iostream>
#include <string>
#include <fstream>
#include <sstream>

#define OP_EOI 0
#define OP_EOP 1
#define OP_PUSH 2
#define OP_POP 3
#define OP_PRINT 4
#define OP_ADD 5
#define OP_MUL 6
#define OP_SUB 7

using namespace std;

class reedoovm {

private:
string filedata;
string instruction;
string file;
int instr;
int instructionCount;
int instructionPointer;
int stack;

public:
string load_program(string filename) {
ifstream rdfile(filename);
while(rdfile >> instruction) {          /* Get each instruction */
filedata += instruction;        /* Append the instruction to filedata */
filedata += ",";                /* Append a comma to separate each instruction */
instructionCount++;
}
rdfile.close();                         /* Close the file */
return filedata;                        /* Return the filedata */
}

int *instrToArr(string file) {
stringstream hextoint;
unsigned int value;
string s = file;                        /* store fconv in a variable "s" */
string delimiter = ",";                 /* The delimiter */
size_t pos = 0;
string token;
int i = 0;
int inst;
static int* instarray;
instarray = (int*) calloc(instructionCount,sizeof(int));
while ((pos = s.find(delimiter)) != string::npos) {     /* Convert hex instructions to decimal */
token = s.substr(0, pos);
stringstream hextoint(token);
hextoint >> hex >> value;
if (i < instructionCount) {
instarray[i] = value;
i++;
}
s.erase(0, pos + delimiter.length());
}
return instarray;
}

int * instructionArray(int instructionArray[]) {
return instructionArray;
}

int getNextIntruction(int instructions[], int i) {
return instructions[i];
}

void do_PRINT() {

}

void do_PUSH(int instructions, int i) {
//cout << instructions[i + 1] << endl;
}

void run_program(int instructions[], string file) {
int loop = 1;
int i = 0;
string delimiter = ",";                 /* The delimiter */
size_t pos = 0;
string token;
int iterator = 0;
instructionCount = count(file.begin(), file.end(), ',');
int instructionOrLiteralArray[instructionCount];
while ((pos = file.find(delimiter)) != string::npos) {     /* Convert hex instructions to decimal */
token = file.substr(0, pos);
if (token.length() == 2) {                             /* Operation */
instructionOrLiteralArray[iterator] = 0;
} else {
instructionOrLiteralArray[iterator] = 1;           /* Literal */
}
iterator++;
file.erase(0, pos + delimiter.length());
}
while (loop) {

instr = getNextIntruction(instructions, i);

if (instr == OP_EOI && instructionOrLiteralArray[i] == 0) {
cout << "EOI" << endl;
} else if (instr == OP_EOI && instructionOrLiteralArray[i] == 1) {
cout << "Literal" << endl;
}

if (instr == OP_PUSH && instructionOrLiteralArray[i] == 0) {
do_PUSH(instr, i);
} else if (instr == OP_PUSH && instructionOrLiteralArray[i] == 1) {
cout << "Literal" << endl;
}

if (instr == OP_PRINT && instructionOrLiteralArray[i] == 0) {
do_PRINT();
} else if (instr == OP_PRINT && instructionOrLiteralArray[i] == 1) {
cout << "Literal" << endl;
}

if (instr == OP_POP && instructionOrLiteralArray[i] == 0) {
cout << "POP" << endl;
} else if (instr == OP_POP && instructionOrLiteralArray[i] == 1) {
cout << "Literal" << endl;
}

if (instr == OP_ADD && instructionOrLiteralArray[i] == 0) {
cout << "ADD" << endl;
} else if (instr == OP_ADD && instructionOrLiteralArray[i] == 1) {
cout << "Literal" << endl;
}

if (instr == OP_SUB && instructionOrLiteralArray[i] == 0) {
cout << "MUL" << endl;
} else if (instr == OP_MUL && instructionOrLiteralArray[i] == 1) {
cout << "Literal" << endl;
}

else if (instructionOrLiteralArray[i] == 1) {
cout << "Literal" << endl;
}

if (i < instructionCount) {
i++;
} else {
loop = 0;
}
}
}

void execute_program(string s) {
file = load_program(s);
int * arr = instrToArr(file);
int * instructions = instructionArray(arr);
run_program(instructions, file);
}

};

int main(int argc, char* argv[]) {
reedoovm rd;
rd.execute_program(argv[1]);
return 0;
}

-3

Решение

Вы не включили алгоритм для std :: count.

instructionCount = count(file.begin(), file.end(), ',');

Я на самом деле даже удивлен, что он строит с помощью clang, потому что не должен, и он не компилируется для меня.

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

Вы должны изменить это в верхней части:

#include <algorithm>

Также обратите внимание, что когда вы пишете эту строку:

ifstream rdfile(filename);

Это означает, что вам нужно будет использовать -std=c++11 опция для компилятора, пусть это будет gcc или clang, потому что этот тип конструктора для ifstream, который принимает std :: string, был введен только в C ++ 11.

Для любой предыдущей версии вам необходимо изменить filename в filename.c_str() чтобы получить char * имя файла.

Поэтому, вот как я сделал ваш код компиляцией после добавления дополнительных явных включений:

g++ -std=c++11 main.cpp

а также

clang -std=c++11 main.cpp
3

Другие решения


По вопросам рекламы [email protected]