#define __STDC_WANT_LIB_EXT1__ 1的问题

来源:9-9 C11的安全版本的函数

wxz123

2021-01-30

问题有点多哈。。。
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回答

bennyhuo

2021-01-30

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

0
3
wxz123
非常感谢!
2021-01-30
共3条回复

bennyhuo

2021-01-30

4. 编译器预置的。

0
2
bennyhuo
回复
wxz123
编译器预置的意思就是没有源码。
2021-01-30
共2条回复

bennyhuo

2021-01-30

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

0
2
bennyhuo
回复
wxz123
定义了这个宏的一定定义了相应的函数,但定义了这些函数的不一定定义了这个宏。 就像课程里面所说的,安全版本的函数了解就行了,用得不多。
2021-01-30
共2条回复

bennyhuo

2021-01-30

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

0
0

bennyhuo

2021-01-30

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

0
0

C语言系统化精讲 重塑编程思想 打造坚实的开发基础

如果通向大牛的道路有捷径,那就是先学好C语言

2208 学习 · 853 问题

查看课程