Веб-сервер Visual Studio меньше прощает [приблизительно 110] в пути.
Это откажется вручать ссылку как: http://localhost:52632/main//images/logo.jpg
, где IIS сделает.
Это довольно неясно, но означает, что у нас есть большая фиксация, чтобы сделать для избавлений от весь эти //
случаи.
Для компиляторов, совместимых с GCC и GCC, используется __ attribute __
, большинство других компиляторов используют директивы #pragma
.
Я думаю, что решение GCC лучше, поскольку обязательное поведение нераспознанного #pragma
- игнорировать его, тогда как если вы используете компилятор, который не понимает спецификацию __ attribute __
, он не будет компилироваться - что в целом лучше, поскольку тогда вы знаете, что вам нужно портировать.
Спецификации атрибутов используются для определения аспектов типов, данных и функций, таких как хранение и выравнивание, которые не могут быть указаны с помощью C. Часто они зависят от цели, в основном они непереносимы, конечно между компиляторами и часто между целями. Избегайте их использования, за исключением случаев, когда это абсолютно необходимо для правильной работы кода.
Одно из применений - принудительное выравнивание памяти для переменных и элементов структуры. Например,
float vect[4] __attribute__((aligned(16)));
будет гарантировать, что вектор
будет помещен на 16-байтовую границу памяти. Я не знаю, является ли это gcc-измом или более широко применимо.
Компилятор обычно выравнивает вектор
только по 4-байтовой границе. С 16-байтовым выравниванием его можно использовать непосредственно с инструкциями загрузки SIMD, где вы загружаете его в 128-битные регистры, которые позволяют сложение, вычитание, скалярные произведения и все виды векторных операций.
Иногда вам нужно выравнивание, чтобы структура может быть непосредственно наложена на отображенные в память аппаратные регистры. Или он должен быть выровнен, чтобы оборудование могло писать в него напрямую, используя механизм прямого доступа к памяти (DMA).
Почему он используется в программах на языке C? Чтобы ограничить их переносимость.
Он начинается с двойного подчеркивания, поэтому он находится в пространстве имен разработчика - это не что-то определенное в языковом стандарте, и каждый поставщик компилятора может использовать его для любых целей.
Править : Почему он используется в программах GNU C? См. Другие ответы на этот вопрос.