Как избежать проблем с типами size_t и int в 64-битных сборках C ++? - PullRequest
9 голосов
/ 30 сентября 2010

Сегодня я впервые сделал 64-битную сборку своего проекта. В основном он скомпилирован, связан и работает нормально, за исключением предупреждений о несовместимости между новым 64-битным типом size_t и простым типом int. В основном это происходит в таких ситуациях в моем коде:

void func(std::vector<Something> &vec)
{
    int n = vec.size();
    for (int i=0; i < n; i++)
    {
        ....vec[i]....
    }
}

Это довольно легко исправить, и я прочитал статью, в которой говорится, что в качестве индексов цикла лучше использовать size_t или ptrdif_t. Но что я могу сделать в такой ситуации?

void outsideLibraryFunc(int n);

void func(std::vector<Something> &vec)
{
    int n = vec.size();
    outsideLibraryFunc(n);
}

Я не могу изменить объявление функции внешней библиотеки, которое ожидает аргумент типа int, и мне нужно передать ему число векторных элементов. Что я могу сделать, кроме отключения предупреждений компилятора?

Ответы [ 2 ]

10 голосов
/ 30 сентября 2010

Выполните явное приведение к int, например,

void outsideLibraryFunc(int n);

void func(std::vector<Something> &vec)
{
    outsideLibraryFunc(static_cast<int>(vec.size()));
}

Это не устраняет потенциальных проблем с преобразованием size_t в int, но говорит компилятору, что вы делаете преобразование специально, и не предупредит вас об этом.

4 голосов
/ 30 сентября 2010

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

...