_countof в stdlib сломан: почему? - PullRequest
0 голосов
/ 07 мая 2018

У меня странная проблема. В очень простом примере ( это c, а не c ++ ):

int test[3];
auto n = _countof(test);

У меня ошибка E0304:

Код серьезности Описание Ошибка состояния подавления строки файла проекта (активный) E0304 нет экземпляра шаблона функции "__countof_helper" соответствует аргументу список

У меня не было этого с visual studio 15.6.7, оно появилось с обновлением 15.7. Набор инструментов не был явно изменен, он все еще:

набор инструментов платформы: Visual Studio 2017 (v141)

Что происходит? Как я могу решить это?

Ответы [ 3 ]

0 голосов
/ 07 мая 2018

Для людей, не имеющих компилятора C ++ 17, это подойдет:

template <class T, std::size_t N>
size_t countof(const T (&array)[N])
{
    return N;
}
0 голосов
/ 08 мая 2018

Эта ошибка сообщается из механизма IntelliSense и не повлияет на сборку проекта. Чтобы избежать раздражения в IntelliSense, можно применить следующий обходной путь:

В vcruntime.h, включенном в ваш проект (вы должны быть в состоянии найти нужный, выполнив Перейти к определению при _countof использовании, а затем Перейти к определению на _crt_countof в определении _countof) заменить:

#if defined _M_X64 || defined _M_ARM || defined _M_ARM64

с:

#if (defined _M_X64 || defined _M_ARM || defined _M_ARM64) && !__INTELLISENSE__

Microsot будет работать над правильным исправлением, поэтому обходной путь в будущем не понадобится.

0 голосов
/ 07 мая 2018

Используйте std::size вместо:

#include <iterator>
int main()
{
    int x[3];
    auto const xs{::std::size(x)};
}

Никаких изменений не требуется после переключения на std::array, std::vector или совместимую оболочку:

::std::array<int, 3> ax{};
auto const axs{::std::size(ax)};
::std::vector<int> vx{0, 0, 0};
auto const vxs{::std::size(vx)};
...