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





http://en.cppreference.com/w/c/string/byte/strtok:
As all bounds-checked functions,
strtok_sis 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 constant1before includingstring.h.
Большое спасибо, не могу поверить, что пропустил это
strtok_s является необязательным в C11; честно говоря, это реализует только Windows. Используйте strtok_r в системах POSIX.
И Windows даже не реализует интерфейсы проверки границ точно так же, как описано в Приложении K C11 (например, нет функции set_constraint_handler_s; вместо этого вы должны использовать специфичную для MSVC функцию _set_invalid_parameter_handler, которая принимает совершенно другой набор аргументов. ).
Буфер не настроен так, чтобы указывать на какую-либо память, которой владеет приложение. Результатом вызова
strtok_s()является неопределенное поведение, которое может привести к событию ошибки сегмента. Предложите 1) установить значение вBufferтак, чтобы оно указывало на массив символов, которым владеет приложение. 2) Инициализируйте массив символов известной строкой.