GCC使用说明

2023-05-16

超详细的参考官方手册下载地址

https://download.csdn.net/download/qq_34991787/16188604

 

GCC代表“GNU编译器合集”
可编译C、C++、Objective-C、 Objective-C++、 Java、 Fortran、 Ada、Go

GCC语言标准:
C89、C90  指令-》 -ansi -std=c90
C99 指令-》  -std=c99
C11 指令-》 -std=c11
GNU拓展C90 指令-》 -std=gun90
GNU拓展C99 指令-》 -std=gnu99
GNU拓展C11 指令-》 -std=gnu11
c++ 98 (export是一个明显的例外)和c++ 03  指令-》  -std=c++98  -std=c++03
-std=gnu++98   -std= GNU ++11
Objective-C 2.0  
Go  http://golang.org/doc/go1.html
Ada

入口函数
int main (void)
int main (int, char *[])

GCC使用的大多数编译器支持例程都在' libgcc '中

编译最多可以包括四个阶段:预处理、适当编译、汇编链接,总是按照这个顺序

任何给定的输入文件,文件名后缀决定进行哪种编译
.c必须经过预处理的C源代码
.i预处理过的C源代码
.ii预处理过的c++源代码
.m objective - c源代码
.mi 不应该被预处理的Objective-C源代码
.M objective - c + +源代码
.mii 不应该被预处理的objective - c++源代码
.h 将C, c++, Objective-C或objective - c++头文件转换为precompile头文件
.cc
.cp
.cxx
.cpp
.CPP
.c++
.C 必须进行预处理的c++源代码
.mm
.M 必须经过预处理的objective - c++源代码
.mii 不应该被预处理的objective - c++源代码
.hh
.H
.hp
.hxx
.hpp
.HPP
.h++
.tcc要转换成预编译头文件或Ada规范的c++头文件
.go GO源代码
.adb 包含库单元主体(子程序或包)的源代码文件
.s汇编代码
.S
.sx必须进行预处理的汇编代码

<stddef.h>, NULL expands to ((void *)0)

指令:
-X 您可以使用' -x '选项指定输入语言 
-x none 关闭语言的任何规范(默认)
-c 编译或汇编源文件,但不要链接生成.o
-S 停止后适当的编译阶段;不组装。生成.s
-E 只进行预处理
-o file 将输出放在file中,未指定的话生成a.out
-v 打印编译器版本号
-pipe 在编译的各个阶段之间使用管道而不是临时文件进行通信
--help 打印命令行选项的描述
-no-canonical-prefixes 不要展开任何符号链接在生成相对前缀时将路径设置为绝对路径
--version 显示被调用的GCC的版本号和版权
-fplugin=name.so 以文件名加载插件代码
-ansi 关闭GCC与ISO C90不兼容的某些特性
-std= 确定语言标准
-fgnu89-inline 用于在C99模式下的内联函数
-fallow-parameterless-variadic-functions 接受不带命名参数的可变参数函数
-fno-asm 不识别asm、inline或typeof作为关键字
-flax-vector-conversions 允许不同元素数量和/或不兼容元素类型的向量之间的隐式转换
-funsigned-char 让char类型为unsigned char
-fsigned-char
-fmessage-length=n 尝试格式化错误消息,使它们适合约n个字符的行
-fdiagnostics-color[=WHEN]
-fno-diagnostics-color 在诊断中使用颜色
-fsyntax-only 检查代码是否有语法错误,但除此之外不要做任何事情
-fmax-errors=n 将错误消息的最大数量限制为n,此时GCC会退出而不是继续处理源代码
-w 禁止所有警告消息。
-Werror 将所有警告变为错误。
-Wfatal-errors 此选项导致编译器在第一个错误发生时中止编译,而不是试图继续并打印进一步的错误消息
-Wall 全部警告
-Wextra 一种更全部的警告
-Wdouble-promotion 当float类型的值被隐式提升为double时,给出警告
-g 以操作系统的本机格式(stab、COFF、XCOFF或DWARF 2)生成调试信息
-ggdb 生成GDB使用的调试信息。这意味着使用可用的最有表现力的格式(DWARF 2、stab,如果这两种格式都不支持,则使用本机格式),如果可能的话,包括GDB扩展。
-Q  使编译器在编译时打印出每个函数名,并在完成编译时打印关于每次传递的一些统计信息。
-time[=file]  按编译顺序报告每个子进程所花费的CPU时间。对于C源文件,这是正确的编译器和汇编器(加上链接器,如果链接完成了)
-dumpmachine 打印编译器的目标机器(例如,' i686-pc-linux-gnu '),并且不做其他任何事情。
-O
-O1 优化等级设置 0-3
-Os 优化尺寸。' -Os '支持所有通常不会增加代码大小的' -O2 '优化。它还执行进一步的优化,以减少代码大小。
-Ofast 忽略严格的标准遵从性。' - fast '启用所有' -O3 '优化。
-Og 不干扰调试的优化。
-flto[=n] 这个选项运行标准的链接时间优化器。当使用源代码调用时,它会生成GIMPLE (GCC的内部表示之一),并将其写入目标文件中的特殊ELF部分。
-I dir  将目录dir添加到要搜索头文件的目录列表中。
-o file 将输出写入文件。
-M 输出适合make的规则,而不是输出预处理的结果描述主源文件的依赖关系
-I- 分割包含路径。在' - i - '之前使用' - i '选项指定的任何目录,只会搜索带有#include "file"请求的头文件;不会在#include &lt;file&gt;中搜索它们。
-nostdinc 不要在标准系统目录中搜索头文件
-include file 处理文件,就像#include "file"出现在主源文件的第一行一样。但是,搜索file的第一个目录是预处理器的工作目录,而不是包含主源文件的目录。
-imultilib dir 使用dir作为包含特定于目标的c++头文件的目录的子目录。
-fexec-charset=charset 设置执行字符集,用于字符串和字符常量。默认为UTF-8。
-P 禁止在预处理器的输出中生成线标记。
-C 不要丢弃注释。所有的注释都被传递到输出文件
-CC 不要丢弃注释,包括在宏展开期间。
-traditional-cpp 尝试模仿老式C预处理器的行为,而不是ISO C预处理器。
-remap 使特殊代码能够在只允许很短文件名的文件系统(如MS-DOS)周围工作。
-H 打印所使用的每个头文件的名称,以及其他正常活动。
-l library 链接时搜索名为library的库。搜索的目录包括几个标准的系统目录加上任何你用' -L '指定的目录。
-lobjc 为了链接一个Objective-C或objective - c++程序,你需要这个特殊的“-l”选项
-pie 在支持它的目标上生成一个位置独立的可执行文件
-s 从可执行文件中删除所有的符号表和重定位信息
-static 把动态链接编译进入文件
-shared  生成一个共享对象,然后可以与其他对象链接,形成可执行文件。
-shared-libgcc
-static-libgcc 在提供' libgcc '作为共享库的系统上,这些选项强制分别使用共享或静态版本
-symbolic 在构建共享对象时,将引用绑定到全局符号
-T script 使用script作为链接器脚本。大多数使用GNU链接器的系统都支持这个选项
-u symbol 假设symbol符号是未定义的,强制链接库模块来定义它。
-Idir 将目录dir添加到要搜索头文件的目录列表的头。
-Ldir 将目录dir添加到要搜索' -l '的目录列表中
-Bprefix 该选项指定在何处找到编译器本身的可执行文件、库、包含文件和数据文件。
ARM
-mabi=name 为指定的ABI生成代码。‘apcs-gnu’,‘atpcs’, ‘aapcs’, ‘aapcs-linux’ and ‘iwmmxt’
-mapcs-frame 生成一个与ARM过程兼容的堆栈框架,对所有函数调用Standard,即使这不是正确执行代码所必需的。
-mthumb-interwork  生成支持ARM和Thumb指令集之间调用的代码。
-mno-sched-prolog 防止在函数序言中重新排序指令,或将这些指令与函数体中的指令合并
-mfloat-abi=name 指定使用哪个浮点ABI。允许的值是:' soft ', ' softfp '和' hard '。
-mlittle-endian 为以小端模式运行的处理器生成代码。这是所有标准配置的默认值
-mbig-endian 为运行在大端模式的处理器生成代码;默认情况下是为小端处理器编译代码
-march=name 这指定了目标ARM架构的名称 ‘armv2’, ‘armv2a’, ‘armv3’, ‘armv3m’, ‘armv4’, ‘armv4t’,‘armv5’, ‘armv5t’, ‘armv5e’, ‘armv5te’, ‘armv6’, ‘armv6j’, ‘armv6t2’, ‘armv6z’,‘armv6zk’, ‘armv6-m’, ‘armv7’, ‘armv7-a’, ‘armv7-r’, ‘armv7-m’, ‘armv7e-m’,‘armv7ve’, ‘armv8-a’, ‘armv8-a+crc’, ‘iwmmxt’, ‘iwmmxt2’, ‘ep9312’.
-mtune=name 这个选项指定GCC应该为其优化代码性能的目标ARM处理器的名称。 ‘arm2’, ‘arm250’, ‘arm3’, ‘arm6’, ‘arm60’, ‘arm600’, ‘arm610’, ‘arm620’, ‘arm7’, ‘arm7m’, ‘arm7d’, ‘arm7dm’, ‘arm7di’, cortex-a53’, ‘cortex-a57’, ‘cortex-a72’, ‘cortex-r4’, ‘cortex-r4f’, cortex-m1’, ‘cortex-m0’, ‘cortex-m0plus’, ‘cortex-m1.small-multiply’, 
-mcpu=name 这指定了目标ARM处理器的名称。
-mfpu=name 这指定了目标上可用的浮点硬件(或硬件模拟)。  ‘vfp’, ‘vfpv3’, ‘vfpv3-fp16’, ‘vfpv3-d16’, ‘vfpv3-d16-fp16’, ‘vfpv3xd’, ‘vfpv3xd-fp16’, ‘neon’,‘fpv5-sp-d16’, ‘fp-armv8’, ‘neon-fp-armv8’, and ‘crypto-neon-fp-armv8、
-mthumb
-marm 在生成以ARM和Thumb状态执行的代码之间进行选择。
-mglibc 使用GNU C库
-muclibc 使用uClibc C库
-mbionic 使用Bionic C库
-mandroid 编译兼容Android平台的代码
-tno-android-cc 禁用' -mandroid '的编译效果,即默认不启用' -mbionic ', ' -fPIC ', ' -fno-exceptions '和' -fno-rtti '
-tno-android-ld 禁用' -mandroid '的链接效果,即将标准的Linux链接选项传递给链接器
-meb 大端模式
-mel 小端模式
-mnhwloop 禁用bcnz指令的生成
-m1 Generate code for the SH1
-m2a-nofpu 为没有FPU的SH2a生成代码,或者为不使用浮点单元的SH2a-FPU生成代码
-fshort-wchar 覆盖wchar_t的底层类型,使其为短unsigned int,而不是目标的默认类型


几个特殊功能的函数
void * __builtin_apply_args ()这个内建函数返回一个指向某些数据的指针,这数据描述了如何用传给当前函数的参数来执行一个函数调
void * __builtin_apply (void (*function)(), void *arguments, size t size)这个内建函数将用保存下来的参数的拷贝来调用function函数, 参数由arguments指针指向的地址和size表示的大小来表示。
void __builtin_return (void *result)这个内建函数返回result所描述的返回值。result应该为__builtin_apply函数的返回值。
__builtin_va_arg_pack ()这个内置函数表示一个内联函数的所有匿名参数
size_t __builtin_va_arg_pack_len ()

128位宽变量
__int128
unsigned __int128
双字整数
long long int
C99及C++11都规定了关键字_Complex
<complex.h>
float _Complex也可以写成_Complex float
double _Complex v1=3.1+5*I;
double _Complex v2=3.2+5*_Complex_I;
float _Complex v3=4.6f+12.0IF;  //必须先写i,后写f
_Complex float v4=8.2f+2.3if;
long double _Complex v5=1.23456789L+3.456789999iL; //必须先写i,后写L

大浮点
__float80
__float128
半精度浮点
__fp16
十进制浮点
_Decimal32, _Decimal64, and _Decimal128
 ‘math.h’, ‘fenv.h’,‘stdio.h’, ‘stdlib.h

参数数量可变宏
#define debug(format, ...) fprintf (stderr, format, __VA_ARGS__)
#define debug(format, args...) fprintf (stderr, format, args)
debug ("A message")
#define debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__)

__attribute__是一个编译属性,用于向编译器描述特殊的标识、错误检查或高级优化。
__attribute__ ((attribute-list)) 

__attribute__((constructor))确保此函数在 在main函数被调用之前调用
__attribute__((destructor))确保此函数在 在main函数被调用之后调
__attribute__((cleanup)) 用于修饰一个变量,在它的作用域结束时可以自动执行一个指定的方法

aligned, alloc_size, alloc_align, assume_aligned, noreturn, returns_twice,
noinline, noclone, no_icf, always_inline, flatten, pure, const, nothrow,
sentinel, format, format_arg, no_instrument_function, no_split_stack, section,
constructor, destructor, used, unused, deprecated, weak, malloc, alias, ifunc,
warn_unused_result, nonnull, returns_nonnull, gnu_inline, externally_visible,
hot, cold, artificial, no_sanitize_address, no_address_safety_analysis, no_
sanitize_thread, no_sanitize_undefined, no_reorder, bnd_legacy, bnd_instrument,
stack_protect, error and warning.
void f () __attribute__ ((weak, alias ("__f")));
void* my_realloc(void*, size_t) __attribute__((alloc_size(2)))
void* my_memalign(size_t, size_t) __attribute__((alloc_align(1)))
void* my_alloc2(size_t) __attribute__((assume_aligned(32, 8)))
int old_fn () __attribute__ ((deprecated));
void f () __attribute__ ((interrupt ("ilink1")));
void __attribute__ ((interrupt ("dma1"))) dma1_handler ();
void fatal () __attribute__ ((noreturn));

如何在C代码中使用内联汇编语言  463
asm [ volatile ] ( AssemblerInstructions )   AssemblerInstructions:这是一个指定汇编程序代码的文字字符串。

464
asm [volatile] ( AssemblerTemplate
: OutputOperands
[ : InputOperands
[ : Clobbers ] ])

asm [volatile] goto ( AssemblerTemplate
:
: InputOperands
: Clobbers
: GotoLabels)

volatile 使用volatile限定符来禁用某些优化。
goto 这个限定符通知编译器,asm语句可以跳转到GotoLabels中列出的标签之一。
AssemblerTemplate 这是一个文字字符串,它是汇编程序代码的模板。它是引用输入、输出和goto参数的固定文本和标记的组合。
OutputOperands 由汇编模板中的指令修改的C变量以逗号分隔的列表。
InputOperands 由汇编模板中的指令读取的以逗号分隔的C表达式列表。允许使用空列表
Clobbers 以逗号分隔的寄存器列表或由汇编器模板更改的其他值,不包括作为输出列出的那些值。允许使用空列表。
GotoLabels 当您使用goto形式的asm时,本节包含汇编模板中的代码可能跳转到的所有C标签的列表。


int src = 1;
int dst;
asm ("mov %1, %0\n\t"
"add $1, %0"
: "=r" (dst)
: "r" (src));
printf("%d\n", dst);

__asm__ __violate__
("movl %1,%0" : "=r" (result) : "m" (input));
“movl %1,%0”是指令模板;“%0”和“%1”代表指令的操作数,称为占位符,内嵌汇编靠它们将C语言表达式与指令操作数相对应。
操作数至多有10个,分别用“%0”,“%1”….“%9,”表示。
“result”前面的限制字符串是“=r”,其中“=”表示“result”是输出操作数,“r”表示需要将“result”与某个通用寄存器相关联,先将操作数的值读入寄存器,然后在指令中使用相应寄存器,而不是“result”本身,当然指令执行完后需要将寄存器中的值存入变量“result”,从表面上看好像是指令直接对“result”进行操作,实际上GCC做了隐式处理,这样我们可以少写一些指令。
“input”前面的“r”表示该表达式需要先放入某个寄存器,然后在指令中使用该寄存器参加运算。

void DoCheck(uint32_t dwSomeValue)
{
uint32_t dwRes;
// Assumes dwSomeValue is not zero.
asm ("bsfl %1,%0"
: "=r" (dwRes)
: "r" (dwSomeValue)
: "cc");
assert(dwRes > 3);
}

oid do_print(uint32_t dwSomeValue)
{
uint32_t dwRes;
for (uint32_t x=0; x < 5; x++)
{
// Assumes dwSomeValue is not zero
asm ("bsfl %1,%0"
: "=r" (dwRes)
: "r" (dwSomeValue)
: "cc");
printf("%u: %u %u\n", x, dwSomeValue, dwRes);
}
}

“CC”
如果一个内联汇编语句的Clobber/Modify部分存在"memory",那么GCC会保证在此内联汇编之前,如果某个内存的内容被装入了寄存器,那么,在这个内联汇编之后,如果需要使用这个内存处的内容,就会直接到这个内存处重新读取,而不是使用被存放在寄存器中的拷贝;因为这个时候寄存器中的拷贝很可能已经和内存处的内容不一致了;
标志寄存器修改通知:
当一个内联汇编中包含影响标志寄存器eflags的条件,那么也需要在Clobber/Modify部分中使用"cc"来向GCC声明这一点;


将全局变量定义在寄存器中
register int *foo asm ("a5");

这些函数可用于获取关于函数调用者的信息。514
void * __builtin_return_address (unsigned int level) [Built-in Function]  打印出一个函数的堆栈地址
void * __builtin_extract_return_addr (void *addr) [Built-in Function] 返回当前函数或其调用者的返回地址
void * __builtin_frob_return_address (void *addr) [Built-in Function] 該函數與__builtin_extract_return_addr相反
void * __builtin_frame_address (unsigned int level) [Built-in Function] 返回函數框的地址而不是函數的返回地址


原子操作 521
type __atomic_load_n (type *ptr, int memmodel) [Built-in Function]原子读
void __atomic_load (type *ptr, type *ret, int memmodel) [Built-in Function]
void __atomic_store_n (type *ptr, type val, int memmodel) [Built-in Function]原子写
void __atomic_store (type *ptr, type *val, int memmodel) [Built-in Function]
type __atomic_exchange_n (type *ptr, type val, int [Built-in Function]原子交换
void __atomic_exchange (type *ptr, type *val, type *ret, int [Built-in Function]
bool __atomic_compare_exchange_n (type *ptr, type [Built-in Function]
bool __atomic_compare_exchange (type *ptr, type [Built-in Function]
type __atomic_add_fetch (type *ptr, type val, int [Built-in Function]
.。。

算数溢出检查 524
bool __builtin_sadd_overflow (int a, int b, int *res) [Built-in Function]

检查内置函数大小 525
size_t __builtin_object_size (void * ptr, int type) [Built-in Function]

指针边界检查 527
void * __builtin___bnd_set_ptr_bounds (const void *q, [Built-in Function]
size t size)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GCC使用说明 的相关文章

随机推荐

  • 【学习笔记】内存的连续分配管理方式

    目录 先决条件单一连续分配固定分区分配动态分区分配补充内部碎片和外部碎片基于顺序搜索的动态分区策略 xff08 算法 xff09 参考与扩展 先决条件 这里介绍的这些内存分配方式都是非常古老的内存分配方式 xff0c 基本已经不在现代操作系
  • 【教程】visual studio debug 技巧总结

    更新中 基础的调试技巧基本更新完毕 xff0c visual studio 提供了强大的调试功能 xff0c 许多东西需要大家动手体验 目录 环境调试器的基本使用更改执行流断点基本的断点操作跟踪点条件断点条件表达式命中次数过滤器 函数断点缩
  • Vm虚拟机创建raid5盘+热备盘

    Vm虚拟机创建raid5盘 43 热备盘 打开vm xff0c 然后创建四个新的虚拟硬盘 xff08 组建raid5盘最少需要3个硬盘 xff0c 我们留一个做热备盘 xff09 创建硬盘的步骤我在前面的博客有写 xff0c 这里就不掩饰了
  • 用VS2012导入工程时出现error MSB8020错误

    导入别人工程后进行编译出现如下错误 xff1a 解决方法 xff1a 在工程名后右击 属性 xff0c 将平台工具集改为自己安装版本的平台工具集如下图所示 xff1a 然后再次进行编辑就可以啦
  • 【学习笔记】windows 下的 shared memory(共享内存)原理与实践

    目录 先决条件共享内存介绍在 Win 下实现共享内存开发环境P1CreateFileMappingMapViewOfFileUnmapViewOfFileCloseHandle P2OpenFileMapping 示例补充File Mapp
  • 【学习笔记】同一个 solution 的不同 project 使用相同的头文件

    目录 环境前言在项目中引入文件添加额外的包含的目录 环境 OS xff1a win10IDE xff1a visual studio 2017 前言 有时候在开发中 xff0c 同一个 solution 下的不同 project 需要共享一
  • 【学习笔记】在 windows 下创建多线程 C++

    目录 先决条件传统的创建方式使用 CreateThread 函数实例 更安全的方式 beginthreadex实例 终止线程补充WaitForMultipleObjects 函数实例 参考 先决条件 最好了解以下内容 了解内核对象了解进程
  • 【教程】在 visual studio 共享和重用项目属性

    目录 环境前言同一项目中 xff0c 不同开发模式和平台的共享不同项目共享和重用项目属性进阶 参考 环境 os xff1a windows 10IDE xff1a visual studio 2015 前言 在 visual studio
  • 【学习笔记】C 语言中未开辟地址的指针作为函数参数传递的问题

    目录 问题描述有问题的做法正确的做法总结 问题描述 有时候我们希望传递一个空指针给一个函数 xff0c 然后该函数在堆上开辟动态内存 xff0c 然后该函数执行完后 xff0c 返回这个动态内存的地址 有问题的做法 先来看下面的一段程序 x
  • 【学习笔记】顺序容器的表格方式总结 C++

    目录 顺序容器及其特点顺序容器操作向顺序容器添加元素insertemplace 参考 更新中 顺序容器及其特点 名字访问元素插入 xff0c 删除元素vector xff08 可变大小数组 xff09 支持快速随机访问在尾部之外的位置插入或
  • 【学习笔记】C++ 下字符串与数字的拼接

    目录 环境sprintfto string 与 to wstring itoa 环境 OS xff1a win 10 IDE xff1a Visual Studio 2017 sprintf 描述 xff1a sprintf 是一种 C 风
  • 【教程】Windows 下 C++ 项目内存泄漏检查

    更新中 目录 环境Visual Stuido Profiling Tools打开方式使用查看原始类型报告查看 Managed 类型报告 参考与拓展 环境 windows 10IDE xff1a Visual Studio 2015 Visu
  • 【学习笔记】读取文件中的字符串与 fgets 的坑

    目录 前言环境问题模拟与复现正确的手法回顾 前言 今天写一个读取文件中字符串的函数 xff0c 理论上应该是很简单的 xff0c 但是写的时候发现输出的结果总是比文件中的内容少一个字符 xff0c 并且通过排查 xff0c 问题就是出在 f
  • [Atcoder Yahoo Contest 2019]D.Ears(动态规划)

    Score 600 600 6 0 0 points 题面 传送门 翻译有时间再补 题解 体验感极差 xff0c 考试的时候手残把1打成了2Debug了半个小时 害的F题都没做 先将题目转换一下 给你一条链 顺次连接着 n 43
  • 内网渗透-基础环境

    解决依赖 xff0c scope安装 打开要给cmd powershell 打开远程 Set ExecutionPolicy RemoteSigned scope CurrentUser 我试了好多装这东西还是得科学上网 xff0c 不然不
  • ubuntu(Linux)配置允许远程登陆

    安装ubuntu后默认不可以以root方式登录系统 xff0c 需要做以下配置 1 使用sudo i 命令可以让用户切换到root用户 xff0c guo用户是安装ubuntu时配置的用户 xff0c 因人而异 xff1b 2 配置root
  • Y9000P Ubuntu/Windows 双系统安装

    一 xff1a 配置介绍 Y9000P默认系统Win11 xff0c 系统盘500G xff0c 从盘2T xff0c 内存32G xff0c 显卡3060 二 xff1a Windows系统分盘 系统盘 xff08 磁盘1 xff09 建
  • axios的使用

    axios是基于Promise的HTTP库 xff0c 适用于各种前端框架 不同于普通http请求后的回调 xff0c Promise有更好的操作性 axios可以自动转换JSON数据 客户端支持防御XSRF攻击 axios的简单使用 安装
  • 怎么通过SQL取出数据库中JSON字段中的值

    我们的数据库中经常会遇到很多JSON的字段 xff0c 自己写的也好 xff0c 别人写的也好 一般我们取这个值的话 xff0c 会创建一个typeHandler来取值 那么如果我们想直接取到JSON里的值该怎么办呢 xff1f 其实很简单
  • GCC使用说明

    超详细的参考官方手册下载地址 https download csdn net download qq 34991787 16188604 GCC代表 GNU编译器合集 可编译C C 43 43 Objective C Objective C