Вы можете использовать черты типа, чтобы проверить, является ли некоторый тип специализацией span
или std::array
. Это работает для меня:
#include
template class span;
template
struct is_array : std::false_type { };
template
struct is_array> : std::true_type { };
template
struct is_span : std::false_type { };
template
struct is_span> : std::true_type { };
template
concept bool NotSpanNotArray = !is_array::value && !is_span::value;
template class span {
public:
template constexpr span(T& cont);
// template constexpr span(const T& cont);
};
Рабочая демонстрация: https://wandbox.org/permlink/M0n60U8Hl4mpacuI
Просто я не уверен на 100%, является ли такой Решение соответствует тому, что участвуют в разрешении перегрузки тогда и только тогда, когда требуется. Некоторые юристы могут прояснить это.
ОБНОВЛЕНИЕ
Я только что понял, что std::is_array
работает только для «обычных» массивов, а не std::array
. Поэтому я добавил также особенность типа is_array
.
Включите предупреждения в своем компиляторе. С gcc я использую эти флаги:
-std=c99 -pedantic -Wall -Wextra -Werror -Wmissing-prototypes
-Wmissing-declarations -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings
-Wredundant-decls -Wnested-externs -Winline -Wno-long-long -Wconversion
-Wstrict-prototypes
Если Ваш код не может быть изменен для не создания предупреждений, отбросьте -Werror
или не используйте определенный флаг, производящий предупреждение.
Кто-то упомянул, что некоторые переключатели компилятора, но имеющий синтаксически гладкий код не собираются гарантировать качественный конечный продукт, потому что существует больше к качеству программного обеспечения, чем это.
Существует несколько классификаций качеств программного обеспечения, но вот список, который можно использовать в качестве контрольного списка:
Существует много аспектов по качеству кода и тоннам статей, книг, блогов
но я могу совет Вы это как начало:
Традиционно, люди использовали линт для выручения с этим.
Трудно видеть Ваше собственное сам, пишете ли Вы качественный код, уверенный, что существуют тонны автоматизации и стандартов там, но как можно применить все, что они видели там?
Это - то, где я - большой поклонник экспертной оценки как метод оценки качества кода. Позвольте другому видеть (и также учитесь) из Вашего кода, и это будет судьей качества.
Используйте инструмент статического анализа, традиционно названный линт, однако я использовал шплинт, который хорош. См. рекомендации в этом вопросе. Лично я рекомендовал бы включить предупреждения и зафиксировать их.
С точки зрения правил
Править: Характерный для C, этот список глюков C является существенным чтением, и даже при том, что это для C++, стоит пройти C++ CERT Безопасный Стандарт Кодирования
Люди до сих пор упомянули инструменты. Однако после определенного предела, существует действительно только одна вещь, которую можно сделать для реального улучшения качества кода, который Вы пишете:
Напишите код.
Предыдущее обсуждение, what-are-some-good-resources-for-learning-c-beyond-kr, могло бы указать на больше (книги) на примеры.
Запишите модульные тесты!
Это могло бы быть более громоздким для записи модульных тестов в C по сравнению с более современными языками, но это все еще в значительной степени стоит того.
Я сказал бы, что надлежащие модульные тесты являются № 1 способ гарантировать качество любого кода. Можно использовать все инструменты статического анализа и кодировать обзоры, которые Вы хотите, но ничто не бьет на самом деле выполнение кода и проверку результатов.
Это зависит частично от того, что Вы подразумеваете 'под качеством C' код.
Один важный аспект программы, "это делает то, что это было разработано, чтобы сделать"? Это трудно измерить, но крайне важно.
Затем необходимо знать, приемлем ли код для компиляторов - использование набора параметров компилятора GCC, обеспеченных Cristoph, указало бы, что код в хорошем состоянии. (Хотя я придрался бы -Wno-long-long
, это зависит от того, где Ваш код, возможно, должен был бы быть быть перемещенным в).
Размещение кода важно. Действительно ли код читаем людьми, а также компиляторами? Действительно ли расположение универсально? Это находится в одном из стандартных форматов - существуют несколько, все с главными followings, и, пока Вы используете одного из них последовательно, код должен быть прекрасным. Это соответственно прокомментировано? Это означает достаточно комментариев, но не слишком многих! Файл должен иметь комментарий заголовка, указывающий, что находится в нем - и вероятно кто записал это, и возможно лицензия, в соответствии с которой он распределяется. Было несколько вопросов на ТАК об этом, включая Профессиональные комментарии #include. Написание кода к стандарту наглядности является стандартной программой после короткого времени, все же.
Документация может быть соответствующей - обычно релевантно. Как кто-то еще знал бы, что код существует, что он делает, как использовать его, когда использовать его, если не для использования его?
Код должен быть написан с достаточно хорошими алгоритмами - он не должен использовать непомерные объемы памяти, диск, или процессорное время. Это не должно также пропускать ресурсы. Нет также никакого смысла в скручивании последнего цикла ЦП улучшения производительности из стандартной программы, которая будет использоваться однажды на выполненную из программы для нескольких миллисекунд, когда это запустит, если Вы не можете продемонстрировать, что это - узкое место производительности для программы в целом.
Wouter van Nifterick дал превосходный набор указателей также.
Некоторые современные методы жизненного цикла программного обеспечения, которые осуществляют качество кода:
Последний может в особенности относиться к языку C.