GCC编译器(2)

2023-11-15

GCC编译器(1)

4、警告选项

在编译过程中,编译器的报错和警告信息对于程序员来说是非常重要的信息,GCC包含完整的出错检查和警告提示功能,它可以帮助Linux程序员尽快找出错误的或潜在的错误代码,从而写过更优美的代码。GCC的编译器警告选项如下表:

类型 说明
-Wall 启用所有警告信息
-Werror 在发生警告时取消编译操作,即将警告看作是错误
-w 禁用所有警告信息

 

下面看一段代码,使用GCC编译,同时开启警告信息:

1
2
3
4
5
6
7
8
9
#include <stdio.h>
void  main ()
{
     int  x;
     for (x=1;x<=10;x++)
     {
         printf ( "%d\n" ,x);
     }
}

对上面的代码进行编译连接:

$ gcc -Wall example3.c -o example3

example3.c:2:6: 警告: ‘main’的返回类型不是‘int’ [-Wmain]

从上面的输出看到,GCC给出了警告信息,意思是main函数的返回值被声明为void,但实际应该是int。

此外,GCC还提供了许多以-W开头的选项,允许用户指定输出某个特定的警告,例如:

  • -Wcomment:出现注释嵌套时发出警告。
  • -Wconversion:如果程序中存在隐式类型转换,则发出警告。
  • -Wformat:检查printf和scanf等格式化输入输出函数的格式字符串和参数类型的匹配情况,如果发现不匹配则发出警告。
  • -Winline:如果函数不能被内联,则发出警告。
  • -Wlong-long:如果使用了long long型数据,则发出警告。
  • -Wmain:如果main函数的返回类型不是int型,或者调用main函数时使用的参数数目不正确,则发出警告。
  • -Wmissing-declarations:如果定义了全局函数,但却没有在头文件中声明,则发出警告。
  • -Wparentheses:在某些情况下,如果忽略掉了括号,则会发出警告。
  • -Wreturn-type:如果函数定义了返回类型,而默认类型是int型,编译器会发出警告。
  • -Wuninitialized:如果使用的自动变量没有被初始化,则发出警告。
  • -Wundef:如果在#if宏中使用了未定义的变量做判断,则发出警告。
  • -Wunused:如果声明的变量或static型函数没有使用,则发出警告。

下面使用GCC编译一段程序,来说明开启警告信息的必要性:

1
2
3
4
5
6
7
#include<stdio>
int  main()
{
     double  x;
     printf ( "%d\n" ,x);  /* 这里将%f误输为%d */
     return  0;
}

对上面的程序进行编译:

$ gcc example4.c -o example4

可以看到,编译并没有报错,运行可执行文件,输出结果为:

$ ./example4

134513689

这不是想要的输出结果,如果在上面的编译中加入-Wformat或-Wall选项,即:

$ gcc -Wformat example4.c -o example4

$ gcc -Wall example4.c -o example4

GCC给出如下警告信息:

example4.c: 在函数‘main’中:

example4.c:5:5: 警告: 格式 ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘double’ [-Wformat]

格式字符串和参数类型的不匹配会导致程序运行错误,所以这是是非常有用的警告选项。

下面使用GCC编译一段程序,使用-Wparentheses选项对其中的括号进行检查。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio>
int  main()
{
     int  a=1;
     int  b=0;
     int  c=1;
     if (a&&b||c)
     {
         ;
     }
     if (a==1)
         if (b==1)
             printf ( "b=1\n" );
     else
         printf ( "b!=1\n" );
     return  0;
}

 

对上面的程序进行编译:

$ gcc -Wparentheses example5.c -o example5

example5.c: 在函数‘main’中:

example5.c:7:5: 警告: 建议在‘||’的操作数中出现的‘&&’前后加上括号 [-Wparentheses]

example5.c:11:7: 警告: 建议显式地使用花括号以避免出现有歧义的‘else’ [-Wparentheses]

所以GCC编译器的警告选项对程序员来说是非常重要的。

 

5、连接选项

GCC编译器提供的连接器选项如下表:

类型 说明
-Idirectory 向GCC的头文件搜索路径中添加新的目录
-Ldirectory 向GCC的库文件搜索路径中添加新的目录
-llibrary 提示连接程序在创建可执行文件时包含指定的库文件
-static 强制使用静态链接库
-shared 生成动态库文件

 

先来理解一下头文件和库文件这两个概念:

头文件包含变量和函数的声明,但没有定义函数的实现。函数的具体实现实在库文件中完成的,库文件可分为静态库和动态库,静态库是指编译连接时,将库文件的代码全部加入到可执行文件中,这样运行时就不需要库文件了。静态库的后缀名一般为“.a”。动态库是指在编译连接时并不将库文件的代码加入到可执行文件中,而是在程序执行时由运行时连接文件加载库文件,这样可以节省系统的开销。动态库的后缀名一般为“.so”。

例如我们编译是用-I选项来指定头文件的路径:

$ gcc example.c –o example –I/home/xxx/include

头文件所对应的库文件,如果没有特别指定时,GCC会到默认的搜索路径进行查找。

使用-L选项来指定库文件的路径,例如:

$ gcc example.c –o example –L/home/xxx/lib

GCC编译器在默认情况下使用动态库,但如果使用了-static选项,连接器将忽略动态库,强制使用静态链接库,即使用如下命令:

$ gcc example.c –o example –static –lm

此时静态库文件中的代码全部包含到可执行文件中,所以生成的可执行文件比较大。

 

FROM: http://www.cnblogs.com/iuices/archive/2011/12/28/2305362.html




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

GCC编译器(2) 的相关文章

  • java设计模式--[创建模式]--简单工厂[simple factory]

    一 簡單工廠 其實它不是一個設計模式 反而比較像是一種編程習慣 由于經常被使用 有些人把這個習慣誤認為是 工廠模式 在談論工廠模式前 先將簡單工廠熟悉一下 二 簡單工廠的UML類圖如下 三 在此用一個事例說明簡單工廠的用法 在一個酒店里可以
  • 爬虫使用Selenium生成Cookie

    在爬虫的世界中 有时候我们需要模拟登录来获取特定网站的数据 而使用Selenium登录并生成Cookie是一种常见且有效的方法 本文将为你介绍如何使用Selenium进行登录 并生成Cookie以便后续的爬取操作 让我们一起探索吧 一 Se
  • 关系数据库——关系操作和关系完整性

    文章目录 一 关系操作 1 基本的关系操作 2 关系数据语言的分类 关系代数语言 关系演算语言 具有关系代数和关系演算双重特点的语言 二 关系的完整性 1 实体完整性 Entity Integrity 实体完整性规则 2 参照完整性 Ref
  • JavaScript实现三子棋

    目录 要做的事 1 初始化棋盘 2 落子操作 3 判断获胜 4 轮流落子 5 重置棋盘 6 棋盘判满 7 源代码 8 效果展示 要做的事 1 初始化棋盘 首先棋盘是一个3 3的二维数组 而我们的二维数组又是分别由一个一个的一维数组组成的 如
  • PTA 7-11 学生CPP成绩计算 总结

    生成上述类并编写主函数 根据输入的学生基本信息 建立一个学生对象 计算其cpp总评成绩 并输出其学号 姓名 总评成绩 输入格式 测试输入包含若干测试用例 每个测试用例占一行 学生姓名 学号 年龄 cpp成绩 cpp考勤 当读入0时输入结束
  • matlab的diag函数

    1 diag函数 基础用法 生成对角矩阵 diag 1 2 3 4 5 ans 1 0 0 0 0 0 2 0 0 0 0 0 3 0 0 0 0 0 4 0 0 0 0 0 5 2 进阶用法 作用 平移对角线 diag a a为正 表示向
  • saltstack部署MySQL主从

    saltstack部署MySQL主从 1 目录结构 2 编写状态文件 2 1 main sls文件内容 2 2 master sls的文件内容 2 3 slave sls文件内容 2 4 grant mysql sls文件内容 2 5 ma
  • 小孩学机器人还是编程好

    小孩学机器人还是编程好 对于很多家长们来说 他们的主要任务就是培养孩子的学习 很多的家长在培养孩子的学习方面可以说是相当的重视的 会给孩子选择一些能够有利于孩子成长的课程 就拿现在很多的家长想要孩子去学习机器人编程的课程来说 有的家长对于小

随机推荐

  • 来自天秤座的梦想_天秤座:单线全自动机器学习

    来自天秤座的梦想 Libra is one of the python package which helps in performing deep learning on a given data set with minimum no
  • git-创建远程分支

    最近公司项目都是迭代 所以需要创建新分支重新开发 1 在当前分支下 一般是master分支 创建test的本地分支 根据自己的需求切换分支进行分支的创建 git checkout b test Switched to a new branc
  • Qt的日常编程过程中遇见的问题和使用

    Qt的日常编程过程中遇见的问题和注意 Qt的日常编程过程中遇见的问题 1 QString和String的转化的格式问题 中文转化过程中会出现问题 2 使用qcustomplot的时候出现错误 LINK2019 无法解析的外部符号 3 Qt报
  • git基础使用

    提交本地仓库 1 git init 初始化仓库 设置用户名和邮箱 进入根目录 cd 查看用户名和密码 cat gitconfig 删除 修改用户名和密码 vim gitconfig 退出 命令行 esc wq q强制退出 git confi
  • 哨兵的作用

    查找中免去越界判断 这种在查找方向的尽头设置 哨兵 免去了在查找过程中每次比较后都要判断查找位置是否越界的小技巧 看似与原先差别不大 但在总数据较多时 效率提高很大 是非常好的编程技巧 代码一 int sequentialSearch in
  • error: (-215:Assertion failed) !_src.empty() in function ‘cv::cvtColor‘

    路径全英文
  • 若依--实现--图片上传

    在学生表当中实现图片 添加 和 修改 只需要4步 其中一步是人家写好的 我们需要现在数据库加一个图片的字段picture 显示页面中只需要这个一步就可以了 field picture title 学生照片 formatter functio
  • 指针 中 数组指针,指针数组,数组传参,指针传参

    1 指针数组 指针数组是一个数组 里面每个元素是指针 初始化如下 2 数组指针 指向数组的指针 形式如下int p 5 因为 比 优先级高 因此表示一个指针必须给 p带上括号 赋初值如下 3 数组指针的应用 include
  • Invalid bound statement (not found): com.lu.tech.eduservice.mapper.EduCourseMapper.queryById

    baseMapper中没有queryById 方法 使用selectById
  • EmlParse:一款超轻量级的批量解析EML格式电子邮件的工具

    工具特点 1 绿色纯天然 无任何依赖库 文件大小不到150K 2 可批量解析EML格式的电子邮件 3 可提取EML文件中的正文和附件到指定目录 4 可生成HTML格式的邮件列表清单 方便用户进行离线阅读 5 可生成JSON格式的邮件列表清单
  • ipv6 inet_pton功能说明

    基于VS2017 include
  • SpringBoot中事务配置

    做个学习笔记 SpringBoot创建的项目由于不存在xml配置文件了 对于用惯Spring的xml配置事务犯了难 百度了下 大多文章都是用 Transactional对每一个方法或类手动添加任务 这样很麻烦 就自己摸索了下 实现了对指定切
  • 2022年美赛C题翻译+思路分享

    MCM C 交易策略 思路在后面 背景 市场交易者频繁买卖波动性资产 目标是最大化其总回报 每次买卖通常都会有佣金 两种这样的资产是黄金和比特币 图 1 黄金每日价格 每金衡盎司美元 资料来源 伦敦金银市场协会 2021 年 9 月 11
  • 灰狼优化算法(GWO)(解决TSP问题,代码完整免费)

    算法背景 灰狼优化算法 GWO 由澳大利亚格里菲斯大学学者 Mirjalili 等人于2014年提出来的一种群智能优化算法 灵感来自于灰狼群体捕食行为 优点 较强的收敛性能 结构简单 需要调节的参数少 容易实现 存在能够自适应调整的收敛因子
  • MYSQL的四种连接查询学习笔记

    内连接 inner join 或者 join 外连接 1 左连接 left join 或者 left outer join 2 右连接 right join 或者 right outer join 3 完成外连接 full join 或者
  • QT TCP简单的通信示例

    TCP服务端 第一步 创建监听套接字的QTcpSever QTcpServer m tsTcpServer 第二部步 listen 监听是否有新的连接进来 int iMyport 如果有新的客户端连接的话 会触发信号newConnectio
  • Appium 环境搭建安装 java sdk 和 Android SDK

    java sdk 下载 java sdk 在官网上下载https www oracle com java technologies downloads java8 windows 无脑下一步安装 但要看清楚安装目录 配置全局变量要用 我的是
  • 关于队列的几个小算法

    1 用静态数组实现队列的基本操作 思路 创建3个变量 start end size size用来查看数组中数据的数量 从而实现添加和删除的长度控制 当添加数据时 如果end size 1 说明end已经指向最后一位 所以 end end s
  • css基础--位移和定位2(鼠标位置,滚动条位置)

    获取鼠标指针的页面位置 e pageX e clientX 获取鼠标指针在元素内的位置 e offsetX e layerX 获取滚动条的位置 self pageXOffset document documentElement docume
  • GCC编译器(2)

    接GCC编译器 1 4 警告选项 在编译过程中 编译器的报错和警告信息对于程序员来说是非常重要的信息 GCC包含完整的出错检查和警告提示功能 它可以帮助Linux程序员尽快找出错误的或潜在的错误代码 从而写过更优美的代码 GCC的编译器警告