d’ expects argument of type ‘int’, but argument 2 has type ‘char *’ [-Wformat=] printf("%d,%f,%c...‘int’, but argument 4 has type ‘char *’ [-Wformat=] 我们可以从报错信息中看到: %d 期望的是 int 类型参数 %f 期望的是 double 类型参数...%c 期望的也是 int 类型参数 而编译之所以有警告是因为,char *类型无法通过默认实际参数提升,将其提升为int或double。...例如,%f期望一个double(8字节)类型,但是传入的参数是int(4字节),那么在处理这个int参数值,可能会多处理4个字节,并且也会造成处理数据错误。...真相大白 有了前面这些内容的铺垫,我们再来解答开始的疑问: 对于问题0,a/b的结果显然为4字节的int类型1,而%f期望的是8字节的double,而计算结果只有4个字节,因此会继续格式化后面4个字节的
’ expects argument of type ‘int’, but argument 2 has type ‘char *’ [-Wformat=] printf("%d,%f,%c\...but argument 4 has type ‘char *’ [-Wformat=] 我们可以从报错信息中看到: %d 期望的是 int 类型参数 %f 期望的是 double 类型参数...%c 期望的也是 int 类型参数 而编译之所以有警告是因为,char *类型无法通过默认实际参数提升,将其提升为int或double。...例如,%f期望一个double(8字节)类型,但是传入的参数是int(4字节),那么在处理这个int参数值,可能会多处理4个字节,并且也会造成处理数据错误。...有了前面这些内容的铺垫,我们再来解答开始的疑问: 对于问题0,a/b的结果显然为4字节的int类型1,而%f期望的是8字节的double,而计算结果只有4个字节,因此会继续格式化后面4个字节的a,而整型
不过,上网查了下,这种用法有时候也可以输出正确的结果,但不建议大家这么用。 GCC编译时也会有警告,提示没有格式化参数。...\n")是类似的,printf函数的第一个参数是const char*类型的,不管是printf("abcd")还是printf(str),效果都是一样的,就是像printf函数传递了一个const char...s", str2); printf(str2); return 0; } gcc编译输出的结果是: A string with % may not work....由于printf支持可变参数,所以后续变量的个数就需要通过str中的格式化串来确定。...当str串中包含%s,%d,%c等格式化串时,printf就会去栈中找这个格式化串对应的变量,但实际上,根本没有向printf压入更多的参数,因此就会出现打印失败或者程序崩溃的现象。
格式化输出参数错误 代码示例 //格式化参数错误,可能会导致非法的内存访问,从而造成宕机 char text[200]; snprintf(text,200,"Valid %u, Invalid %u...解决方法 在书写输出格式和参数时,要做到参数个数和类型都要与输出格式一致。 在GCC的编译选项中加入-wformat,让GCC在编译时检测出此类错误。...在GCC编译时,在-O1以上的优化行为下,使用-D_FORTIFY_SOURCE=level进行编译(其中level=1或2,level代表的是检测级别的不同,数值越大越严格)。...这样GCC会在编译时报告缓冲区溢出的错误。...的原因 Bug评述 如果是程序主动abort的,通过堆栈加源码还是很好定位的,但往往abort的位置是在系统库中,就不好定位了,需要多查看系统API的使用方法,检查是否使用不当。
GNU CC需要使用 –Wall,这是控制警告信息的一个很好的方式。下面介绍几个常见的属性参数。 2. format 该属性可以使编译器检查函数声明和函数实际调用参数之间的格式化字符串是否匹配。...当遇到函数需要返回值却还没运行到返回值处就已退出来的情况,该属性可以避免出现错误信息。...4. const 该属性只能用于带有数值类型参数的函数上,当重复调用带有数值参数的函数时,由于返回值是相同的。所以此时编译器可以进行优化处理,除第一次需要运算外, 其它只需要返回第一次的结果。...取一个2的次方值,使得该值大于等于6,则该值为8,所以编译器将设置S类型的对齐方式为8字节。...该声明将强制编译器确保(尽它所能)变量类型为struct S或者more-aligned-int的变量在分配空间时采用8字节对齐方式。
这样编译32位时,需要机器上有32位的libc头文件和库文件,但一些机器上可能没有,比如没有/lib目录,只有/lib64目录,这表示不支持32位的libc。...但经过检查,这两个原因,而是因为gcc和g++混用原因: 1. 库libhiredis.a和libhiredis.so是由gcc编译出来的 2....) 上面这个错误的意思是第一个参数的类型为 void (*)(unsigned char, std::basic_string, short unsigned int) 但传入的类型为...void (*)(unsigned char, const std::basic_string&, short unsigned int) 从上面的对比可以看出,要求函数的第二个参数为std:...这个错误是因为格式化%s参数的值为std::string值,这个在运行时可能会触发SIGILL(Illegal instruction),例如: std::string type; std::string
文章目录 工具gcc编译器VS2019 C语言编译过程C语言代码主体必要内容 C语言数据类型关键字常量变量进制表示sizeof 关键字整型:intshort、int、long、long long...,Linux平台为a.out,Windows平台为a.exe gcc、g++编译常用选项说明: 选项含义-o file指定生成的输出文件名为file-E只进行预处理-S(大写)只进行预处理和编译-c...3)汇编:将汇编文件生成目标文件(二进制文件) 4)链接:C语言写的程序是需要依赖各种库的,所以编译之后还需要把库链接到最终的可执行程序中去 这里用gcc展示一下编译过程 vim hello.c...虽然 C 语言标准中没有明确规定整型数据的长度,但 long 类型整数的长度不能短于 int 类型, short 类型整数的长度不能长于 int 类型。...printf格式字符: 打印格式对应数据类型含义%dint接受整数值并将它表示为有符号的十进制整数%hdshort int短整数%huunsigned short无符号短整数%ounsigned int
# 9 "main.c" 2 int main(int argc, char **argv) { printf("Hello World !...@octopus:~/gcc$ gcc main.c main.c: 在函数‘main’中: main.c:12:2: 警告: 格式 ‘%s’ expects argument of type ‘char...*’, but argument 2 has type ‘int’ [-Wformat] octopus@octopus:~/gcc$ ..../a.out 段错误 (核心已转储) 2....错误, 就需要注意 文件排列的问题; 修改文件流程 : 当修改了一个文件之后, 只需要 重新编译这个文件即可, 之后将这个新编译的对象文件 与 原来的对象文件进行链接, 即可生成新的可执行文件; --
,是 int 类型对应的无符号类型 注意, 使用 int * 作为 unsigned int 的别名,不符合标准,但 gcc 和 clang 都做了拓展,因此没有问题。...("%c\n", *ptr); // *ptr 是 char 类型的左值表达式, char 类型可以作为任何类型的别名。...,还是开启 GCC -O2, -O3, -Os 优化,如果想让违反严格别名规则代码在编译的时候产生告警需要增加 -Wstrict-aliasing 编译选项。...: 0 0 我们可以通过 godbolt 这个网站实时查看 C/C++ 代码的汇编代码: 在 GCC 开启 -O2编译优化时,输出结果为: 0 1 4.1.2 开启 -Wstrict-aliasing...在 GCC 开启 -O2 -fwrapv 或 -O2 -fno-strict-overflow 编译参数后,输出结果为: 2147483647 0 -fwrapv 编译选项指示 GCC 编译器假定加法
文章目录 工具 gcc编译器 VS2019 C语言编译过程 C语言代码主体 必要内容 C语言数据类型 关键字 常量 变量 进制表示 sizeof 关键字 整型:int short、int、long、long...(自定义类型) C语言的文件 工具 Linux环境下一般都是通过gcc来编译C代码的。...3)汇编:将汇编文件生成目标文件(二进制文件) 4)链接:C语言写的程序是需要依赖各种库的,所以编译之后还需要把库链接到最终的可执行程序中去 这里用gcc展示一下编译过程 vim hello.c...虽然 C 语言标准中没有明确规定整型数据的长度,但 long 类型整数的长度不能短于 int 类型, short 类型整数的长度不能长于 int 类型。...失败:NULL 注意:如果参数dest所指的内存空间不够大,可能会造成缓冲溢出的错误情况。
这种情况下,如果表的数量很多的话,那数据同步的成本是非常大的,因为目标端需要提前构建出全部的表结构。...注意 由于后面在数据同步时需要用到pg_config这个命令,但postgresql95在安装好之后默认是不会将pg_config放到环境变量里的: [root@VM-5-48-centos ~]# pg_config...+编译器 由于后面编译需要用到c++编译器,所以这里需要安装一下: [root@VM-5-48-centos dbsync]# yum install gcc-c++ Loaded plugins: fastestmirror...可选参数,指定一个文本文件,文件中含有需要同步的表;如果不指定此参数,则同步配置文件中指定数据库下的所有表。...为一个文件名,里面含有需要同步的表集合以及表上查询的条件,其内容格式示例如下: table1 : select * from table_big where column1
标准格式: 数据类型 变量名; 示例: int age = 25; float height = 5.9; char grade = 'A'; 输出: 没有直接输出,但这些变量可以用于后续计算和输出。...错误处理 12.1. 错误码 标准格式: #include char* strerror(int errnum); 说明: errno 是一个全局变量,保存最近的错误代码。...编译器选项 13.1. 编译选项 标准格式: gcc [options] source_file -o output_file 说明: 编译器选项用于控制编译过程,包括优化、调试信息生成等。...示例: gcc -Wall -O2 -std=c99 -o my_program my_program.c 输出: 没有直接输出,但编译器生成了名为 my_program 的可执行文件。 14....包括程序结构、数据类型、变量和常量、控制结构、函数、数组和字符串、结构体和联合、枚举和联合、预处理器指令、动态内存分配、文件操作、错误处理、编译器选项、调试和优化、C语言的标准库、编程技巧以及编程习惯等方面的详细讲解
不冲突,但与 const 无法共存 “const int ”和“int const”的意思?...,但需要用户自己管理指针的生命周期 只排序部分数据,最佳的算法是 partial_sort 二进制格式与复杂数据结构无关,MessagePack 可以序列化任意数据类型,无论多复杂的结构。...//转发参数 ); } 09 exception #include C++ 处理异常的方式: 判断函数返回值 判断全局错误码,errno 业务逻辑和错误处理混在一起...C++,目前它还不太擅长做这种工作,可能还是改用其他语言来处理更好 字符串后缀s是C++14的特性,C++11没有,需要升级gcc到5.4,然后启用C++14标准。.../onlinedocs/gcc/Optimize-Options.html 里查到,-flto 大概的作用就是:在编译时,会在生成的目标文件里,插入一个特殊的格式信息(GIMPLE 格式)。
(2)带参宏和带参函数的一个重要差别就是:宏定义不会检查参数的类型,返回值也不会附带类型;而函数有明确的参数类型和返回值类型。...当我们调用函数时编译器会帮我们做参数的静态类型检查,如果编译器发现我们实际传参和参数声明不同时会报警告或错误。...注:用函数的时候程序员不太用操心类型不匹配因为编译器会检查,如果不匹配编译器会警告(但是实际测试并没有警告,理论上是有的);用宏的时候程序员必须很注意实际传参和宏所希望的参数类型一致,否则可能编译不报错但是运行有误...argument of type ‘int’, but argument 2 has type ‘double’ [-Wformat=] printf("c = %d....,实现思想就是宏定义中参数列表的最后一个参数为省略号(也就是三个英文输入法下的句号)。
6.2.2 gcc命令 gcc命令格式是: gcc [选项] 文件列表 gcc命令用于实现c程序编译的全过程。文件列表参数指定了gcc的输入文件,选项用于定制gcc的行为。...第10行:书写格式错误,变量a没有对应的输出格式。 我们对上面的文件进行编译,还记得上面我们讲的编译警告选项吗?...^ 错误警告信息分析:还是有警告信息,该警告指的是printf中的格式参数太多,也就是没有添加变量a的输出格式,继续解决错误信息和警告,添加变量a的输出格式,然后继续编译,如下:...2)CFLAGS:编译的时候使用的参数,-Wall -g -c 3)LDFLAGS:链接库使用的选项,-L -l 其中:默认值可以被修改,比如CC默认值是cc,但可以修改为gcc:CC=gcc...6.5.6.1 wildcard函数 用于查找指定目录下指定类型的文件,函数参数:目录+文件类型,如下: $(wildcard 指定文件类型) 其中,指定文件类型,如果不写路径,则默认为当前目录查找
首先,__attribute__用于在函数,变量或类型声明时进行特殊属性设置的编译器指令。需要注意,它是一种编译器指令,这也就表明了使用它我们可以做更高级的检查与优化功能。...__attribute__((format(__NSString__, 1, 2))); format属性有3个参数可以设置,其中第一个参数指定要检查的格式化风格,这里设置为NSString的格式化风格...,第2个参数为格式化字符串参数的位置,从1开始,第3个参数为对应的格式化可变参数的位置。...这种编译时即可对函数参数进行检查的机制可以避免写很多运行时的代码,并且比运行时更高效的规避错误。...overliadable属性可以指定某个函数为可重载,这样既可定义名字相关参数不同的多个C函数,在调用时,编译器会根据传入的参数类型自行判断具体调用哪个函数,如下: ?
以下以封装socket函数为例,描述一个错误处理的常见手段。...【Tips】fmt参数可以是一个带格式的字符串 void err_sys(const char *fmt, ...){ va_list ap; va_start(ap, fmt); //...【Tips】fmt参数可以是一个带格式的字符串 void err_sys(const char *fmt, ...){ va_list ap; va_start(ap, fmt); //...2)正常输出 - 编写Makefile 关注回上面的编译脚本,首先需要逐个文件进行编译,然后链接所有的文件,项目文件很多的情况下编译工作将会非常繁琐,所以需要引入Makefile来协助编译、链接生成可执行文件...下周继续进行网络编程的知识点: 1、改造为并发服务器 2、读写状态
g++ test.o -o test.out //生成二进制.out可执行文件 2.命令格式 gcc [-c|-S|-E] [-std=standard] [-g] [-pg] [...-Werror={warning} 将指定警告设置为错误。例如-Werror=return-type,如果函数需要返回值却没有return语句,则编译报错 -w 关闭所有警告,建议不要使用此项。...-fno-strict-prototype 只对g++起作用,使用这个选项,g++将对不带参数的函数,都认为是没有显式的对参数的个数和类型说明,而不是没有 参数.而gcc无论是否使用这个参数,都将对没有带参数的函数...-funsigned-char -fno-signed-char -fsigned-char -fno-unsigned-char 这四个参数是对char类型进行设置,决定将char...类型设置成unsigned char(前两个参数)或者signed char(后 两个参数)。
这是编译器出于对空间,压栈速度等因素的考虑,对其进行了优化,但这并不影响变长参数的实现。 对于上面的情况,如果我们编译成64位程序又是什么样的情况呢?...(a,b,c,d,e); return 0; } 编译为32位程序运行: gcc -m32 -o paraTest paraTest.c ....但是我们要注意的是,这个小程序不像printf那样,对传入的参数做了校验,因此一但传入的参数num和实际参数不匹配,或者传入类型与要计算的int类型不匹配,将会出现不可预知的错误。...变长参数实现注意事项 1.…前的参数可以有1个或多个,但前一个必须是确定类型。 2.传入参数会可能会出现类型提升。...3.va_arg的type类型不能是char,short int,float等类型,否则取值不正确,原因为第2点。
这是编译器出于对空间,压栈速度等因素的考虑,对其进行了优化,但这并不影响变长参数的实现。 对于上面的情况,如果我们编译成64位程序又是什么样的情况呢?...0; } 编译为32位程序运行: gcc -m32 -o paraTest paraTest.c ....但是我们要注意的是,这个小程序不像printf那样,对传入的参数做了校验,因此一但传入的参数num和实际参数不匹配,或者传入类型与要计算的int类型不匹配,将会出现不可预知的错误。...变长参数实现注意事项 1.…前的参数可以有1个或多个,但前一个必须是确定类型。 2.传入参数会可能会出现类型提升。...3.va_arg的type类型不能是char,short int,float等类型,否则取值不正确,原因为第2点。
领取专属 10元无门槛券
手把手带您无忧上云