当前位置: 首页 > article >正文

postgresql gcc编译选项解释

postgresql gcc编译选项解释

在使用make编译时候,输出的gcc选项:

gcc -std=gnu99 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2 -I../../../src/include  -D_GNU_SOURCE   -c -o postgres.o postgres.c

这条命令是用于编译 postgres.c 文件并生成目标文件 postgres.o 的 GCC(GNU Compiler Collection)编译命令。

  • -std=gnu99:指定 C 语言的标准为 GNU 99。
  • -Wall:打开几乎所有的警告信息。这有助于发现代码中的潜在问题。
  • -Wmissing-prototypes:警告那些没有声明原型的函数。这有助于确保函数的接口被明确声明,从而提高代码的可读性和可维护性。
  • -Wpointer-arith:对函数指针或者void *类型的指针进行算术操作时给出警告。

  • -Wdeclaration-after-statement:在C99之前,C语言不允许在代码块的中间声明变量(只能在块的开始处)。这个选项在C99模式下仍然会警告那些将变量声明放在代码块中间的情况,尽管这在C99中是合法的。

  • -Werror=vla:将变长数组(Variable Length Array, VLA)的警告提升为错误。这有助于避免使用可能导致栈溢出的变长数组。

  • -Wendif-labels:警告#else或#endif后面跟标识符。默认开启。

  • -Wmissing-format-attribute:警告那些应该使用format属性但未使用的函数(如printfscanf等函数的参数)。这有助于确保字符串格式化函数的参数类型正确。

  • -Wformat-security:检查格式字符串中的潜在安全问题,如缓冲区溢出。

  • -fno-strict-aliasing:禁用严格的别名规则。这允许编译器进行某些优化,但可能会引入一些难以发现的错误,特别是在涉及指针类型转换时。

  • -fwrapv:在整数运算溢出时,将结果包装(wrap around)到其表示范围内,而不是产生未定义行为。

  • -fexcess-precision=standard:控制浮点数的精度。这个选项确保在浮点运算中遵循C标准的规定,而不是使用可能更高精度的硬件特性。

  • -O2:启用优化选项 2。这会提高代码的运行速度,但可能会稍微增加编译时间。

  • -I:添加包含文件(头文件)的搜索路径。这意味着编译器会在这个路径下查找 #include 指令指定的文件。

  • -D_GNU_SOURCE:定义 _GNU_SOURCE 宏。这会让编译器和链接器包括 GNU 特有的特性,如一些 GNU C 库中的扩展函数。

-Wpointer-arith举例

#include <stdio.h>  
  
// 函数声明  
int add(int a, int b);  
int subtract(int a, int b);  
  
// 函数指针类型定义  
typedef int (*Operation)(int, int);  
  
// 使用函数指针的示例函数  
int calculate(Operation op, int a, int b) {  
    return op(a, b);  
}  
  
// 函数实现  
int add(int a, int b) {  
    return a + b;  
}  
  
int subtract(int a, int b) {
    return a - b;  
}  
  
int main() {  
    Operation op1 = add;
    Operation op2 = subtract;
    Operation op3 = add + 1;//对函数指针进行运算
  
    printf("%d + %d = %d\n", 5, 3, calculate(op1, 5, 3));  
    printf("%d - %d = %d\n", 5, 3, calculate(op2, 5, 3));  
  
    return 0;  
}

gcc -Wpointer-arith -c hello.c

hello.c: In function ‘main’:
hello.c:27:25: warning: pointer to a function used in arithmetic [-Wpointer-arith]
     Operation op3 = add + 1;//对函数指针进行运算

-Wdeclaration-after-statement

#include <stdio.h>

int main(int argc, char *argv[]) {
    int var = 10;
    printf("var = %d\n", var);
    int var1 = 10; // 声明在语句之后,将会报错
    printf("var1 = %d\n", var1);
    return 0;
}

gcc -Wdeclaration-after-statement hello.c

hello.c: In function ‘main’:
hello.c:6:5: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
     int var1 = 10; // 声明在语句之后,将会报错
     ^

-Wendif-labels

#include <stdio.h>

int main()
{
#if FOO
//...
//...
#endif FOO

    return 0;
}

默认就是开启的。


http://www.kler.cn/a/316581.html

相关文章:

  • C++中的字符串实现
  • Zabbix6.0升级为7.2
  • 深入解析 Spring Bean 配置与装配:从基础到进阶的实用指南
  • 各种电机原理介绍
  • Bluetooth Spec【0】蓝牙核心架构
  • 什么是3DEXPERIENCE SOLIDWORKS,它有哪些角色和功能?
  • JAVA执行引擎详细介绍
  • Qt Creator 集成开发环境 常见问题
  • 【代码随想录Day25】回溯算法Part04
  • CPU使用率较高排查和解决思路
  • vue + leaflet + 天地图实现搜索省份后高亮
  • Linux bash脚本本地开发环境(Git Bash)配置
  • 干货满满:嵌入式电阻的重要作用全知晓
  • 实验——完全使用Ansible部署多台服务器的服务
  • CTF 技能树 LOG -GIT泄露 笔记
  • 【磨皮美白】基于Matlab的人像磨皮美白处理算法,Matlab处理
  • react hooks--useContext
  • 【Nginx】在 Docker 上安装 Nginx 的详细指南
  • CVE-2024-46103
  • 无源蜂鸣器简介
  • 【百日算法计划】:每日一题,见证成长(017)
  • Python 类class的用法详解
  • 渗透测试综合靶场 DC-2 通关详解
  • comfyui中报错 Cmd(‘git‘) failed due to: exit code(128) 如何解决
  • 【医疗大数据】医疗保健领域的大数据管理:采用挑战和影响
  • 【2025】中医药健康管理小程序(安卓原生开发+用户+管理员)