user-0 提问: 为什么会提示未定义的引用？

回复:
user: user-1
content: Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt

user: user-2
content: 大兄弟，这个问题解决了嘛？

user: user-3
content: 链接时出的问题，有几点可疑: 1) 程序开始的#define 2) 编译过程中的warning 3) 用的gcc版本支持c11标准么? 4) 链接的c库中是否有strnlen_s之类的符号?

user: user-0
content: 引用 12 楼 tjroamer 的回复:[quote=引用 8 楼 coverlo 的回复:] [quote=引用 6 楼 user-6 的回复:] strnlen_s 是M$对strnlen函数的安全加强版，VS版本中可以使用 你的IDE是Dev C++版本貌似不提供strnlen_s 你直接使用strnlen算了，记得比strnlen_s少个参数 正在下载vs2012，看能不能通过编译[/quote]  MS定义了strnlen_s，应该没有问题的。如果用gcc来编译，肯定会出现你的问题，因为gcc的库函数里面没有定义strnlen_s[/quote] 确实没有man到strnlen_s  man string 里面也没有strnlens

user: user-4
content: 引用 8 楼 coverlo 的回复:[quote=引用 6 楼 user-6 的回复:] strnlen_s 是M$对strnlen函数的安全加强版，VS版本中可以使用 你的IDE是Dev C++版本貌似不提供strnlen_s 你直接使用strnlen算了，记得比strnlen_s少个参数 正在下载vs2012，看能不能通过编译[/quote]  MS定义了strnlen_s，应该没有问题的。如果用gcc来编译，肯定会出现你的问题，因为gcc的库函数里面没有定义strnlen_s

user: user-5
content: 引用 9 楼 coverlo 的回复:[quote=引用 7 楼 xsklld 的回复:] [quote=引用 4 楼 coverlo 的回复:] [quote=引用 2 楼 xsklld 的回复:] strnlen_s之类的函数即使在C11也是可选实现的，你可以通过检查__STDC_LIB_EXT1__是否定义来判断编译器有没有实现这类函数。 检查了可以实现的， 但是编译就是通不过啊[/quote]  据我所知glibc是没有实现这类函数的，除非你用的不是glibc库，但Dev-C++默认使用的MinGW应该是用的glibc库。 你怎么检查的？应该这么检查（参考strcpy）： #ifdef __STDC_LIB_EXT1__     // output something #endif 注意我说的是__STDC_LIB_EXT1__，不是你定义的__STDC_WANT_LIB_EXT1__。前者由库决定是否定义，后者是在库定义了前者的前提下由用户定义以便使用strnlen_s之类的函数。[/quote] #include<stdio.h>  int main(void) { 	#if defined _STDC_LIB_EXT1_ 		printf("Optional functions are defined.\n"); 	#else 		printf("Optional functions are not defined.\n"); 	#endif 		return 0; } 代码如上，在centos下是可以支持。 会输出Optional functions are defined[/quote]  那就不知道了，你gcc用的是什么版本？我用最新版的gcc运行输出的是not defined，编译选项只是多了警告选项，应该不会有影响： 运行结果

user: user-0
content: 引用 7 楼 xsklld 的回复:[quote=引用 4 楼 coverlo 的回复:] [quote=引用 2 楼 xsklld 的回复:] strnlen_s之类的函数即使在C11也是可选实现的，你可以通过检查__STDC_LIB_EXT1__是否定义来判断编译器有没有实现这类函数。 检查了可以实现的， 但是编译就是通不过啊[/quote]  据我所知glibc是没有实现这类函数的，除非你用的不是glibc库，但Dev-C++默认使用的MinGW应该是用的glibc库。 你怎么检查的？应该这么检查（参考strcpy）： #ifdef __STDC_LIB_EXT1__     // output something #endif 注意我说的是__STDC_LIB_EXT1__，不是你定义的__STDC_WANT_LIB_EXT1__。前者由库决定是否定义，后者是在库定义了前者的前提下由用户定义以便使用strnlen_s之类的函数。[/quote] Dev c++是不支持可选函数，我只是截的dev c++的图，因为他们的错误提示都是一样的

user: user-0
content: 引用 7 楼 xsklld 的回复:[quote=引用 4 楼 coverlo 的回复:] [quote=引用 2 楼 xsklld 的回复:] strnlen_s之类的函数即使在C11也是可选实现的，你可以通过检查__STDC_LIB_EXT1__是否定义来判断编译器有没有实现这类函数。 检查了可以实现的， 但是编译就是通不过啊[/quote]  据我所知glibc是没有实现这类函数的，除非你用的不是glibc库，但Dev-C++默认使用的MinGW应该是用的glibc库。 你怎么检查的？应该这么检查（参考strcpy）： #ifdef __STDC_LIB_EXT1__     // output something #endif 注意我说的是__STDC_LIB_EXT1__，不是你定义的__STDC_WANT_LIB_EXT1__。前者由库决定是否定义，后者是在库定义了前者的前提下由用户定义以便使用strnlen_s之类的函数。[/quote] #include<stdio.h>  int main(void) { 	#if defined _STDC_LIB_EXT1_ 		printf("Optional functions are defined.\n"); 	#else 		printf("Optional functions are not defined.\n"); 	#endif 		return 0; } 代码如上，在centos下是可以支持。 会输出Optional functions are defined

user: user-0
content: 引用 6 楼 user-6 的回复:strnlen_s 是M$对strnlen函数的安全加强版，VS版本中可以使用 你的IDE是Dev C++版本貌似不提供strnlen_s 你直接使用strnlen算了，记得比strnlen_s少个参数 正在下载vs2012，看能不能通过编译

user: user-5
content: 引用 4 楼 coverlo 的回复:[quote=引用 2 楼 xsklld 的回复:] strnlen_s之类的函数即使在C11也是可选实现的，你可以通过检查__STDC_LIB_EXT1__是否定义来判断编译器有没有实现这类函数。 检查了可以实现的， 但是编译就是通不过啊[/quote]  据我所知glibc是没有实现这类函数的，除非你用的不是glibc库，但Dev-C++默认使用的MinGW应该是用的glibc库。 你怎么检查的？应该这么检查（参考strcpy）： #ifdef __STDC_LIB_EXT1__     // output something #endif 注意我说的是__STDC_LIB_EXT1__，不是你定义的__STDC_WANT_LIB_EXT1__。前者由库决定是否定义，后者是在库定义了前者的前提下由用户定义以便使用strnlen_s之类的函数。

user: user-6
content: strnlen_s 是M$对strnlen函数的安全加强版，VS版本中可以使用 你的IDE是Dev C++版本貌似不提供strnlen_s 你直接使用strnlen算了，记得比strnlen_s少个参数

user: user-0
content: 附上清晰的程序和错误信息

user: user-0
content: 引用 2 楼 xsklld 的回复:strnlen_s之类的函数即使在C11也是可选实现的，你可以通过检查__STDC_LIB_EXT1__是否定义来判断编译器有没有实现这类函数。 检查了可以实现的， 但是编译就是通不过啊

user: user-0
content: 引用 1 楼 nothingbutpassion 的回复:链接时出的问题，有几点可疑: 1) 程序开始的#define 2) 编译过程中的warning 3) 用的gcc版本支持c11标准么? 4) 链接的c库中是否有strnlen_s之类的符号? 1)开头的是#define _STDC_WANT_LIB_EXT1_    1 2)warnning 说的很清楚啊 3)支持c11的啊 4)我用 man strnlen_s 没有查到，提示没有strnlen_s entry  我也不知道怎么出错了，我在其他地方查了一下，说可选函数要在vs2012,2015这些ide才可以实现 哎，一头雾水啊

user: user-5
content: strnlen_s之类的函数即使在C11也是可选实现的，你可以通过检查__STDC_LIB_EXT1__是否定义来判断编译器有没有实现这类函数。