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" каждый раз, когда я переключаю компьютеры?
1 ответ
Как упомянуто в комментарии vector::size_t
зависит от платформы и может быть 32 или 64 бит и формат %zu
справиться с этим.
В качестве альтернативы вы можете написать что-то вроде:
(Я использую C++11, for-range, необработанные строки (чтобы не пришлось бежать \"
), но это также можно сделать в 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;
}