请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

#define __STDC_WANT_LIB_EXT1__ 1的问题

问题有点多哈。。。
1、老师,您在2分的时候说 mingw是在MSVC上套个壳是啥意思,这俩不应该是两套实现完全不一致的编译器吗?
2、wsl的gcc和mingw的gcc有啥区别吗?
3、老师,我查了一下,#define __STDC_WANT_LIB_EXT1__ 1这个宏的解释:
’’‘
开启标准库对于一些函数的更安全的版本(比如 strcpy_s memset_s 之类的)的支持。
’’'
但我发现不写#define __STDC_WANT_LIB_EXT1__ 1,mingw也可以运行strcpy_s这个函数,那#define __STDC_WANT_LIB_EXT1__ 1这个宏有啥用呢?还是说写了#define __STDC_WANT_LIB_EXT1__ 1这个宏,支持安全版函数的编译器才会定义__STDC_LIB_EXT1__这个宏,进而通过__STDC_LIB_EXT1__这个宏是否定义来判断是否要用这些安全版本的函数呢?
4、
老师,类似于__STDC_WANT_LIB_EXT1__这种宏的定义一般都去哪找呢?我用 ctrl+鼠标左键 点不动啊
5、

#define __STDC_WANT_LIB_EXT1__ 1
#include <io_utils.h>
#include <string.h>
#include <stdlib.h>

int main() {
#ifdef __STDC_LIB_EXT1__
  puts("support C11 safe version.");
#else
  puts("No support for C11 safe version.");
#endif

  char dst[2];
  int error_no = strcpy_s(dst, 2, "Too long!");
  PRINT_INT(error_no); // 34
  if (error_no) {
    perror("strcpy_s returns: "); // strcpy_s returns: : Result too large
  }
  return 0;
}

老师mingw和MSVC最后都会输出No support for C11 safe version.,那说明__STDC_LIB_EXT1__这个宏未定义啊,这是为啥呢?另外MSVC运行上面的代码会报错,如下图。。。
图片描述

正在回答

5回答

5. 对于c11,他们都是只支持其中一部分。

0 回复 有任何疑惑可以回复我~
  • 提问者 wxz123 #1
    既然写了#define __STDC_WANT_LIB_EXT1__ 1,为啥mingw和MSVC编译器还是会出现__STDC_LIB_EXT1__这个宏未定义的情况呢
    回复 有任何疑惑可以回复我~ 2021-01-30 22:49:00
  • bennyhuo 回复 提问者 wxz123 #2
    因为人家没有支持啊。你只是是我想要,人家也没说一定给你。
    回复 有任何疑惑可以回复我~ 2021-01-30 22:49:59
  • 提问者 wxz123 #3
    非常感谢!
    回复 有任何疑惑可以回复我~ 2021-01-30 22:56:48
bennyhuo 2021-01-30 22:40:03

4. 编译器预置的。

0 回复 有任何疑惑可以回复我~
  • 提问者 wxz123 #1
    类似于__STDC_WANT_LIB_EXT1__这种宏的介绍一般都去哪找呢
    回复 有任何疑惑可以回复我~ 2021-01-30 22:47:16
  • bennyhuo 回复 提问者 wxz123 #2
    编译器预置的意思就是没有源码。
    回复 有任何疑惑可以回复我~ 2021-01-30 22:49:05
bennyhuo 2021-01-30 22:39:27

3.因为mingw可以访问msvc原生的函数,而这些安全版本的函数msvc早就支持了。

0 回复 有任何疑惑可以回复我~
  • 提问者 wxz123 #1
    老师,对于__STDC_WANT_LIB_EXT1__ 这个宏,我的理解是写了#define __STDC_WANT_LIB_EXT1__ 1,支持安全版函数的编译器才会定义__STDC_LIB_EXT1__这个宏,进而通过__STDC_LIB_EXT1__这个宏是否定义来判断是否要用这些安全版本的函数,我这么理解对吗
    回复 有任何疑惑可以回复我~ 2021-01-30 22:46:31
  • bennyhuo 回复 提问者 wxz123 #2
    定义了这个宏的一定定义了相应的函数,但定义了这些函数的不一定定义了这个宏。
    
    就像课程里面所说的,安全版本的函数了解就行了,用得不多。
    回复 有任何疑惑可以回复我~ 2021-01-30 22:48:36
bennyhuo 2021-01-30 22:38:40

2. wsl的gcc是linux上的gcc,mongw的是windows上的移植版本,二者在库上和功能上难免有一定的差异

0 回复 有任何疑惑可以回复我~
bennyhuo 2021-01-30 22:37:25

1. mingw是对windows api做的一层封装,mingw的程序运行时也会依赖msvc的c库。

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信