代码之家  ›  专栏  ›  技术社区  ›  hiy

在os x上未定义strtok\u

  •  2
  • hiy  · 技术社区  · 6 年前

    我正在尝试使用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)
    

    我正在OS X 10.12.6上使用clang 8.1.0。我做错了什么?

    2 回复  |  直到 6 年前
        1
  •  5
  •   Jonathan Leffler Toon Krijthe    6 年前

    strtok_s 在C11中是可选的;老实说,只有Windows实现了它。使用 strtok_r 在POSIX系统上。

        2
  •  3
  •   melpomene    6 年前

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

    作为所有边界检查函数, strtok_s 仅保证在以下情况下可用 __STDC_LIB_EXT1__ 由实现定义,如果用户定义 __STDC_WANT_LIB_EXT1__ 到整数常量 1 包括之前 string.h