gcc выдает ошибку при компиляции на одном компьютере, но не на другом

У меня есть программа, которую я компилирую на двух компьютерах с Ubuntu. Оба работают под управлением 14.04 и предположительно одной и той же версии gcc. Но когда я компилирую его на одном компьютере, я получаю ошибку

warning: format ‘%i’ expects argument of type ‘int’, but argument 4 
has type ‘std::vector<colorgrad>::size_type {aka long unsigned int}’ [-Wformat=]

Я думаю, что оскорбительный код

for (vector<colorgrad>::size_type i = 0; i < grad.size(); ++i) {

    fprintf(svgOut, "%s%i%s%f%srgb(%i, %i, %i)%s\n", "<stop id=\"stop", i,"\" offset=\"",grad.at(i).perc ,"\" style=\"stop-color: ",grad.at(i).r, grad.at(i).g, grad.at(i).b, ";stop-opacity:1;\" />" );

}

Ошибка исчезает, когда я заменяю первый «% i» на «% lu», но затем, когда я компилирую этот код на другом компьютере, gcc выдает противоположную ошибку и будет компилироваться только с «% i».

Как мне заставить этот код компилироваться на обоих компьютерах, не отключая "% i" каждый раз, когда я переключаю компьютеры?


person kelvinsong    schedule 29.07.2014    source источник
comment
Предположительно, на одном из ваших компьютеров установлена ​​64-разрядная версия Ubuntu, а на другом - 32-разрядная. См. этот вопрос. Но поскольку для этого нет хорошей кроссплатформенной истории, подумайте также об использовании iostreams вместо fprintf.   -  person HostileFork says dont trust SE    schedule 29.07.2014
comment
Используйте %zu вместо size_type.   -  person eduffy    schedule 29.07.2014


Ответы (1)


Как указано в комментарии vector::size_t, зависит от платформы и может быть 32- или 64-битным, и формат %zu управляет этим.

В качестве альтернативы вы можете написать что-то вроде:
(я использую C ++ 11, for-range, Raw strings (чтобы не было необходимости экранировать \"), но это также можно сделать в C ++ 03)

std::ofstream oss; // initialize it with correct value
std::size_t i = 0;
for (const auto& color : grad) {
    oss << R"(<stop id="stop)" << i << R"(" offset=")" << color.perc
        << R"(" style="stop-color: rgb()"
        << color.r << ", " << color.g << ", "<< color.b
        << R"();stop-opacity:1;" />)" "\n"; // you may replace "\n" by std::endl
    ++i;
}
person Jarod42    schedule 29.07.2014