LINUX.ORG.RU

ошибка: ‘strcpy_s’ was not declared in this scope

 ,


0

1

вот часть кода на C++ https://pastebin.com/Z86Q8jLt вот скрин ошибки : http://savepic.ru/14116259.png Если кратко ошибка: ‘strcpy_s’ was not declared in this scope, хотя cstring подключен В чем проблема?



Последнее исправление: cetjs2 (всего исправлений: 3)

Почему ты ждешь этой функции от cstring? Это Windows фича, причем от студии, если мне память не врет.

peregrine ★★★★★
()

bounds-checking функции в стандарте C (в C++ их нет) являются опциональными и в glibc отсутствуют. Но есть вот библиотека (сам не пробовал).

xaizek ★★★★★
()
Ответ на: комментарий от peregrine

Они в C11 набор *_s функций пропихнули, но их поддержка опциональна.

xaizek ★★★★★
()

У меня вопрос. Это с или с+? Если второе, то почему и зачем активно используются приемы из с? Ну и почему не используется std::string?

Silerus ★★★★
()
Ответ на: комментарий от Ocakypa

ясно, ну, у с++ есть куча классов контейнеров, которые упрощают работу с массивами char, например std::string - и не надо выделять память очищать и тд - все за тебя, в разумных пределах конечно (если память через new отдал где то никто чистить за тебя не будет естественно -сам), сделают. Ну и библиотека std - богата -там много есть чего. Кроме того стоит озаботится умными указателями, тут главное тоже с умом.

Silerus ★★★★
()
Ответ на: комментарий от Ocakypa

Вот именно по причине того, что к C++ переходят после C и есть много говнокода. C++ надо с нуля изучать, это совершенно другой язык.

peregrine ★★★★★
()
Ответ на: комментарий от Ocakypa

Тебе бы в Job с такими проблемами. Может кто за деньги и напишет как надо, сам то ты совсем видать плохо кодишь, там же черным по белому написано - strcpy_s не переваривает твои аргументы. Либо бери винду со студией и пиши, как учили, если так на самом деле учили, либо разбирайся, как strcpy_s использовать и чем студийная версия отличается по синтаксису и семантике от той, что в 11 версии стандарта появилась.

Тебе скорее всего надо это читать, а не это.

peregrine ★★★★★
()

Не благодари

#include <stdlib.h>
#include <errno.h>

#ifndef strcpy_s

#ifndef errno_t
#define errno_t int
#endif

errno_t strcpy_s(char* dst, size_t size, const char* src)
{
    if(!dst || !src) return EINVAL;

    for(;size > 0;--size)
    {
        if(!(*dst++ = *src++)) return 0;
    }

    return ERANGE;
}

#ifdef __cplusplus
template<size_t size>
errno_t strcpy_s(char (&dst)[size], const char* src)
{
    return strcpy_s(dst, size, src);
}
#endif

#endif

lovesan ★★
()
Ответ на: комментарий от utf8nowhere

На MS, емнип, много что определяется макросами. Не уверен правда что и эти функции тоже, но вдруг.

Суть то понятна.

А так, можно воткнуть и свой макрос, и соответствующий дефайн, и проверять его, или там банально _MSC_VER какой-нибудь

lovesan ★★
()
Ответ на: комментарий от Ocakypa

Ты подрубил ее версию от с. все файлики с приставкой с - это сишные версии. И у тебя получилось смешение стилий, надо просто либо уйти в с либо перейти в с++ окончательно. Пользы от смешивание не много, а навредить можно легко. Т.е тебе вообще не нужна эта функция. Используй std::string и копирование будет происходить на вроде вот такокого

std::string a,b;
a="hello ";
b="world!"
a+=b;
a+=" - ugly world";
if(a==b)
std:cout<<"equal"<<std::endl;
else
std:cout<<"not equal"<<std::endl;

Silerus ★★★★
()
Ответ на: комментарий от Ocakypa

Так, подрубил я библиотеку, нотеперь я точно запутался, как заставить работать этот код http://savepic.ru/14115253.png

То есть у вас нет и минимального понимания того, что вы делаете?
Попробуйте присмотреться к строкам 24 и 25. Подумайте, чем они отличаются.

Строка 16 говорит о полном непонимании предмета и нежелании его понять.

andreyu ★★★★★
()
Ответ на: комментарий от lovesan

Суть то понятна.

Ты выражаешься как выпускница филфака.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.