Использование нестандартных функций в Code::Blocks

У меня есть книга «Начало C» Айвора Хортона, я прочел ее наполовину, и она мне нравится; Все идет нормально. Я использую Code::Blocks в Windows в качестве своей IDE, и теперь я столкнулся с проблемой, которую не могу решить уже около 3 дней.

Автор упоминает некоторые «необязательные» функции в <string.h>, такие как strnlen_s(), а также говорит, что они доступны в новом стандарте C11 (книга 2013 года; я не знаю, насколько новый C11 на самом деле), и он также дает фрагмент кода, который будет определять, "поддерживает ли стандартная библиотека, поставляемая с вашим компилятором C, эти необязательные функции". Это код:

#include <stdio.h>

int main(void)
{
#if defined __STDC_LIB_EXT1__
    printf("Optional functions are defined.\n");
#else
    printf("Optional functions are not defined.\n");
#endif
    return 0;
}

Поэтому я запускаю код, чтобы проверить, работает ли GCC в Code::Blocks, и определить, что это не так. В книге не рекомендуются ни компилятор, ни IDE; Я выбрал Code::Blocks с GCC самостоятельно, так как именно по нему я сдаю экзамены в колледже, поэтому я решил, что должен познакомиться с окружением.

Дело в том, что я понятия не имею, как это «исправить», поскольку strnlen() не работает, strnlen_s() не работает и куча других, и я не могу продолжать читать книгу. Не то, чтобы они мне нужны, или я не могу сделать это по-другому (strlen() прекрасно работает), но было бы неплохо знать, как использовать нестандартные функции.


person slamdunker    schedule 17.02.2015    source источник


Ответы (3)


Современные версии GCC, безусловно, поддерживают C11, вам необходимо включить его с помощью флага компилятора -std=c11.

Я предполагаю, что вы используете какой-то вариант MinGW с Code::Blocks — я рекомендую использовать MinGW-W64. так как он активно поддерживается и очень актуален.

Кроме того, наборы инструментов gcc MinGW-W64 доступны по адресу TDM-GCC.

Самой среде Code::Blocks IDE все равно, какую версию C вы используете, это не влияет на то, какие библиотеки у вас есть.

person Riot    schedule 17.02.2015
comment
Поэтому я включил -std=c11 в параметры Project-Build...-Debug- Other options tab. (Правильно ли я сделал?) И ничего не меняется, код из ОП по-прежнему выводит, что необязательные функции не определены. Я получил первую версию для Windows отсюда codeblocks.org/downloads/26, рекомендуемую если вы не знаете, что делаете, и я, конечно, не знаю. Я напутал? Разве у этого не должно быть MinGW, о котором вы говорите? - person slamdunker; 18.02.2015
comment
Да, вы можете либо поместить его в другие параметры проекта, либо другие параметры, специфичные для одной или нескольких целей, либо, в качестве альтернативы, вы можете установить его глобально, перейдя в настройки-›компилятор-›глобальные настройки компилятора-›другие параметры. - person Riot; 18.02.2015
comment
Позвольте мне попробовать последнее, потому что весь проект не работает. Кроме того, теперь я вижу, что, возможно, облажался, я не уверен, буду ли я загружать первую, как я сказал, или действительно рекомендуемую, которая будет второй по этой ссылке. Это было 2 месяца назад. - person slamdunker; 18.02.2015
comment
Нет, все то же самое. :С - person slamdunker; 18.02.2015
comment
@slamdunker: Просто игнорируйте, что MS продвигает приложение K, и полностью игнорируйте его. - person Deduplicator; 18.02.2015
comment
Тьфу, черт возьми, я не могу этого сделать, я даже не могу настроить компилятор по ссылке, которую ты мне дал. Я сдаюсь, я просто буду использовать другие функции. Всем спасибо! - person slamdunker; 18.02.2015

Вы говорите о необязательном Приложении K, которое Microsoft протолкнула.

К.2 Область применения

1 В этом приложении указан ряд необязательных расширений, которые могут быть полезны для устранения уязвимостей безопасности в программах и содержат новые функции, макросы и типы, объявленные или определенные в существующих стандартных заголовках.
2 Реализация, определяющая __STDC_LIB_EXT1__, должна соответствовать со спецификациями в этом приложении.380)
3 Подпункт K.3 следует читать так, как если бы он был объединен в параллельную структуру поименованных подпунктов раздела 7.

Обычно считается, что это глубоко ошибочно, и Microsoft пытается заставить его использовать как серьезную неприятность.
Это особенно важно, поскольку они являются единственным крупным игроком, реализующим их, и их версии не соответствуют требованиям.

glibc с gcc, например, обеспечивают большинство предполагаемых преимуществ этого приложения без введения новых функций, препятствуя использованию половины стандартной библиотеки и навязывая такой громоздкий API программистам.

Возможно, вы захотите прочитать C tag-wiki и, в частности, взять черновик стандарта C11 (от 2011 года, как следует из названия).

person Deduplicator    schedule 17.02.2015
comment
См. также используете ли вы "безопасные" функции TR 24731 , в котором есть ответы, в которых указано, где вариант функции Microsoft отличается от стандартного варианта функций с теми же именами, что ограничивает их удобство использования. TR 24731 был техническим отчетом, предшествовавшим тому, что стало Приложением K в C11. Кроме того, немногие (если вообще есть) поставщики, кроме Microsoft, фактически реализовали эти функции. - person Jonathan Leffler; 18.02.2015
comment
То есть автор книги продался? :D Это то, что многие люди говорили мне, выбросьте книгу, используйте K&R, но дело в том, что дело больше не в функциях безопасности, или в том, хороши они или нет. Я просто ненавижу то, что я застрял на том, что я НЕ МОГУ сделать, а не на том, что я хочу или хочу сделать. - person slamdunker; 18.02.2015
comment
@slamdunker: Дело в том, что эти интерфейсы в приложении k не работают, и если бы MS не нажимала так сильно, они бы не достигли даже статуса необязательного. Если они прекратят свою FUD-кампанию, их специальная реализация умрет тихой смертью даже в Windows. - person Deduplicator; 18.02.2015
comment
@slamdunker: автор книги использовал функции, которые являются необязательной частью стандарта C11 и частью, которую многие реализации решили не реализовывать. Он смог использовать компиляторы Microsoft и поддержку библиотеки времени выполнения для (приближений) этих функций. Он мог не осознавать или, возможно, не заботиться о том, что другие разработчики решили не реализовывать функции. Многие функции можно написать без труда, если только вы не хотите имитировать механизмы сообщения об ошибках. Некоторые реализовать сложнее: например, эксклюзивный код доступа к файлу для fopen_s(). - person Jonathan Leffler; 18.02.2015
comment
@JonathanLeffler, есть ли способ найти компиляторы Microsoft и использовать их в Code::Blocks, или мне придется загружать 6-гигабайтную IDE MS, чтобы я мог использовать несколько функций, которые мне могут никогда не понадобиться в консольных приложениях, которые я делаю с моим уровень знаний, т. крестики-нолики. - person slamdunker; 18.02.2015
comment
@slamdunker: не нужно приобретать IDE, достаточно только platform-sdk. Все-таки 2,5 Гб — это не так уж и мало. microsoft.com/en-us/download/details.aspx? идентификатор=3138 - person Deduplicator; 18.02.2015
comment
Итак, когда я загружу это, я смогу использовать некоторые файлы из него через code::blocks для компиляции моих программ в code::blocks? Извините, что беспокою вас так долго, но я действительно только начал возиться с этим, единственная IDE, которую я когда-либо использовал, это Code::blocks, и я даже не знал, какой компилятор он использует по умолчанию, пока Я столкнулся с этой проблемой и погуглил. - person slamdunker; 18.02.2015
comment
Да, вы можете настроить code::blocks для их использования. Тем не менее, я не использую его, поэтому я не знаю, как это сделать. Людей, сделавших это, наверное, легион и без меня... - person Deduplicator; 18.02.2015

Необязательное приложение K из стандарта C11 еще не получило широкого распространения (см. ">комментарий ниже). Например, по состоянию на февраль 2015 года он не был объединен с glibc.

Хорошей новостью является то, что вы можете попробовать альтернативный компилятор. Например, Pelles C для Windows — это модифицированный LCC с расширенной поддержкой новейших функций C11 (таких как атомарные и Модель потоков C11, которая, я думаю, также упоминается в вашей книге). Вот некоторая базовая программа, которая компилируется и запускается в нем:

#include <stdio.h>
#include <string.h>

int main(void)
{
#if defined __STDC_LIB_EXT1__
    printf("Optional functions are defined.\n");
#else
    printf("Optional functions are not defined.\n");
#endif

    char *str = "Hello Annex K";
    printf("%zu\n", strnlen_s(str, 5));

    return 0;
}

Выход:

Optional functions are defined.
5
Press any key to continue...
person Grzegorz Szpetkowski    schedule 17.02.2015
comment
Еще нет? Скорее, он был насильственно отвергнут по причине, и поскольку с возрастом он не становится лучше, нет причин подозревать какие-либо изменения в этом. - person Deduplicator; 18.02.2015
comment
Я мог бы решить проблему, загрузив Visual Studio (думаю, мне так и сказали), но меня сейчас не интересует переход на IDE, и насколько я понимаю, Pelles C — это целое новая IDE, а не просто компилятор. Спасибо за вклад! - person slamdunker; 18.02.2015
comment
@Deduplicator: я считаю, что для этого есть веские причины. Возможно, то же самое и для <threads.h>, поскольку потоки POSIX гораздо более распространены, и они останутся такими в течение длительного времени. - person Grzegorz Szpetkowski; 18.02.2015
comment
@GrzegorzSzpetkowski, ни одна тема здесь не совсем другая, они (медленно) реализуются. Реакцию сообщества open source на приложение K можно назвать просто аллергической, и я не думаю, что это произойдет. - person Jens Gustedt; 18.02.2015