Strtok_s не определен в OS X

Я пытаюсь использовать функцию C11 strtok_s, которая должна быть определена в <string.h>, но clang выдает мне ошибку связывания, когда я пытаюсь ее использовать. Компиляция этой программы:

#include <string.h>

int main() {
    char * buffer;
    char * state;
    rsize_t strmax = 0;
    char * fpl = strtok_s(buffer, &strmax, "\n", &state);
}

Выдает мне эту ошибку:

repro.c:7:15: warning: implicit declaration of function 'strtok_s' is invalid in
  C99 [-Wimplicit-function-declaration]
    char * fpl = strtok_s(buffer, &strmax, "\n", &state);
                 ^
repro.c:7:9: warning: incompatible integer to pointer conversion initializing
  'char *' with an expression of type 'int' [-Wint-conversion]
    char * fpl = strtok_s(buffer, &strmax, "\n", &state);
           ^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2 warnings generated.
Undefined symbols for architecture x86_64:
  "_strtok_s", referenced from:
  _main in repro-3dcfc9.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Я использую clang 8.1.0 в OS X 10.12.6. Что я делаю неправильно?

Буфер не настроен так, чтобы указывать на какую-либо память, которой владеет приложение. Результатом вызова strtok_s() является неопределенное поведение, которое может привести к событию ошибки сегмента. Предложите 1) установить значение в Buffer так, чтобы оно указывало на массив символов, которым владеет приложение. 2) Инициализируйте массив символов известной строкой.

user3629249 15.04.2018 18:37

См. Также Вы используете "безопасные" функции TR-24731? - и обратите внимание, что strtok_s(), определенный в Приложении K стандарта C11, не соответствует ни strtok_s(), реализованному в Windows, ни strtok_r(), реализованному для систем POSIX - хотя Windows strtok_s() и POSIX strtok_r() по существу эквивалентны друг другу.

Jonathan Leffler 04.06.2018 19:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
440
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

http://en.cppreference.com/w/c/string/byte/strtok:

As all bounds-checked functions, strtok_s is only guaranteed to be available if __STDC_LIB_EXT1__ is defined by the implementation and if the user defines __STDC_WANT_LIB_EXT1__ to the integer constant 1 before including string.h.

Большое спасибо, не могу поверить, что пропустил это

hiy 14.04.2018 16:30
Ответ принят как подходящий

strtok_s является необязательным в C11; честно говоря, это реализует только Windows. Используйте strtok_r в системах POSIX.

И Windows даже не реализует интерфейсы проверки границ точно так же, как описано в Приложении K C11 (например, нет функции set_constraint_handler_s; вместо этого вы должны использовать специфичную для MSVC функцию _set_invalid_parameter_handler, которая принимает совершенно другой набор аргументов. ).

user539810 14.04.2018 16:42

Другие вопросы по теме