Я использую Linux, компилирую с g cc, получаю сообщение об ошибке: предупреждение: неявное объявление функции 'fopen_s', может кто-нибудь помочь мне исправить это? - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь написать простую программу обнаружения краев на c. Я использую Red Hat Enterprise Linux Server 7.7 (Maipo) и g cc версия 4.8.5.

Это начало кода:

#include <stdio.h>

#define size 200

int _tmain(int argc, _TCHAR* argv[])
{
    char filein[size] = "./image.bmp";

    FILE *fin;

    fopen_s(&fin, filein, "rb");

return 0;

}

У меня изначально было много проблем с _TCHAR *, так что в итоге я заменил его просто на char, я понятия не имею, будет ли это быть проблемой позже, но, по крайней мере, он скомпилирован и избавился от этих ошибок. Теперь я получаю неявное объявление декларации. Я пытался исправить это, добавив другие # include.

Я пытался исправить это с помощью:

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

#define size 200

int main(int argc, char* argv[])
{
    char filein[size] = "./image.bmp";

    FILE *fin;

    fopen_s(&fin, filein, "rb");

return 0;

}

Но я все еще получаю то же предупреждение, может кто-то скажите, что я делаю не так?

Спасибо.

Большое вам спасибо, это работает!

#include <stdio.h>

#define size 200

int main(int argc, char* argv[])
{

    char filein[size] = "./image.bmp";

    FILE *fin;

    fin = fopen(filein, "rb");

return 0;

}

Ответы [ 2 ]

4 голосов
/ 20 февраля 2020

серии функций _s являются дополнительными функциями из Приложения K стандарта C и редко приводят к реализации любой реализации C для реализации Приложения K. Фактическая полезность «безопасных» функций, представленных в Приложении K очень спорный; просто отбросьте эти функции и используйте стандартные функции, такие как fopen.

Единственный раз, когда я сталкивался с функциями _s, был код, написанный для Windows, и Microsoft включает свои собственные версии этих функций, которые не соответствуют стандарту, изложенному в Приложении K.

См. здесь исследование, посвященное полезности Приложения K: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1967.htm

Их вывод:

Несмотря на то, что прошло более десяти лет с момента первоначального предложения и почти десять лет с момента ратификации ISO / IEC TR 24731-1: 2007, и почти пять лет с момента Внедрение интерфейсов проверки границ в стандарт C не дало жизнеспособных соответствующих реализаций. API продолжают вызывать споры, и исполнители продолжают отклонять запросы на их реализацию.

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

Поэтому мы предлагаем исключить Приложение K из следующего пересмотра стандарта C или объявить его устаревшим и затем удалили.

1 голос
/ 20 февраля 2020

fopen_s доступно только в дополнительной библиотеке проверки границ C11. Чтобы использовать его, вам нужно сделать:

#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <errno.h>
... // rest of program

Затем скомпилировать с -std=c11 и молиться.

Поскольку библиотека проверки границ имеет плохую поддержку компилятора, и я не уверен, сколько из этого на самом деле реализовано g cc. По общему мнению C программистов, библиотека с проверкой границ опасна и ее следует избегать - ее выпуск был полным фиаско.

Вам лучше забыть все об этой библиотеке и использовать fopen вместо.

...