C ++ Casting для разных целей (компиляторы) - PullRequest
4 голосов
/ 21 мая 2019

Учитывая следующее:

код-ссылка

Вот сам код для удобства (и я не уверен, что моя ссылка работает):

#include <iostream>
#include <vector>
#include <stdint.h>

using namespace std;

int main()
{
    cout<<"Hello World";
    std::vector<std::string> test_vect {"1", "2"};
    long unsigned int size = static_cast<long unsigned int>(test_vect.size());

    std::cout << "size: " << size << std::endl;
    return 0;
}

И следующие параметры компиляции: g++ file.c -Wall -Wextra "-Werror" "-Wuseless-cast"

Здесь вы можете видеть, что я кастую vector.size() на long unsigned int, это помечено как бесполезное приведение на Wandbox (моя ссылка) однако тот же код, выполняемый на моем Linux-компьютере, не выдает предупреждение, но он выдаст мне другое предупреждение, если я не произнесу его.

Я понимаю, что два unsigned longпротив size_t могут быть разные.Но то, что я пытаюсь сделать, это написать некоторый код, который не имеет предупреждений со всеми установленными предупреждениями о приведении (возможно, это является оптамизитным при кросс-компиляции).

Итак, один компилятор жалуется, что я преобразовываю типы, поэтому яприведение, но затем другой компилятор жалуется на бесполезное приведение - поэтому я удаляю приведение - и все вокруг: (

Есть ли хороший подход к этому, чтобы я не получал предупреждения ни на одном из компиляторов?

Я собирался просто удалить опцию -Wuseless-cast, но я думал, что увижу, есть ли у кого-нибудь другие идеи ...

Ответы [ 3 ]

6 голосов
/ 21 мая 2019

то, что я пытаюсь сделать, это написать некоторый код, который не имеет предупреждений со всеми установленными предупреждениями о приведении (возможно, это оптамизит при кросс-компиляции)

Оптимистично при кросс-компиляции, если у вас есть приведения.

Есть ли хороший подход к этому, чтобы я не получал предупреждения ни на одном из компиляторов?

Нет бросков. Сделайте вашу переменную типа std::size_t.

Я собирался просто удалить опцию -Wuseless-cast

Это другой вариант.

2 голосов
/ 21 мая 2019

Как указывало Lightness Races на орбите , size_t - это опция, в ней должен быть соответствующий макрос, чтобы компиляторы были довольны, если вы как-то не хотите использовать это - делая свою переменную auto или decltype(test_vect.size()) будет другой вариант:

auto size = test_vect.size();

или

decltype(test_vect.size()) size = test_vect.size();
1 голос
/ 21 мая 2019

Один аргумент, который приходит на ум: почему ваша переменная размера должна быть вообще long unsigned вместо std::size_t?

На всякий случай, если для этого есть веская причина, как насчет (C ++ 17):

long unsigned size;
if constexpr(sizeof(long unsigned)!=sizeof(std::size_t))
    size = static_cast<long unsigned>(...);
else
    size = ...;
...