【ARM 嵌入式 编译系列 2.9 -- GCC 编译如何避免赋值判断 if ( x = 0)】


===> ARM GCC 编译精讲系列课程链接 <===


文章目录

GCC 编译避免赋值判断

在 GCC 编译中,为了避免误将赋值操作用于条件判断(例如 if (break_var = 0x0))导致的错误,可以使用 -Wall 参数。-Wall 是一个启用一组常见警告的选项,其中包括警告赋值操作被用作条件表达式的 -Wparentheses

不过,更具体地,使用 -Werror=parentheses 可以将这种情况视为错误来强制修复。以下是相关参数的介绍:

参数说明

  • -Wall:启用一组常用的警告,包括但不限于使用赋值操作作为表达式条件时发出的警告。
  • -Wparentheses:发出关于可能存在优先级问题的警告,例如在条件语句中使用赋值操作时。
  • -Werror=parentheses:将警告视为错误,以确保这些问题在编译时被修复。

示例

假设我们有以下代码:

c 复制代码
#include <stdio.h>

int main(void) 
{
    int break_var = 1;
    if (break_var = 0x0) {  // This line contains a mistake: assignment instead of comparison
        printf("break_var is zero\n");
    } else {
        printf("break_var is not zero\n");
    }
    return 0;
}

编译命令

使用以下命令编译代码以捕获并处理这个问题:

bash 复制代码
gcc -Wall -Werror=parentheses -o my_program my_program.c

编译器会输出如下错误信息:

复制代码
my_program.c: In function 'main':
my_program.c:5:9: error: suggest parentheses around assignment used as truth value [-Werror=parentheses]
    5 |     if (break_var = 0x0) {  // This line contains a mistake: assignment instead of comparison
      |         ^
cc1: all warnings being treated as errors

解决方法

在条件判断中使用比较操作 == 而不是赋值操作 =

c 复制代码
if (break_var == 0x0) {
    printf("break_var is zero\n");
} else {
    printf("break_var is not zero\n");
}

通过这些警告选项,开发者可以有效捕获和修正这类常见的编程错误,提高代码的正确性和健壮性。

相关推荐
dadaobusi18 小时前
qemu构建arm环境(AI生成)
arm开发
mucheni1 天前
迅为RK3562开发板ARM四核A53核心板多种系统适配全开源
arm开发
阿让啊1 天前
单片机获取真实时间的实现方法
c语言·开发语言·arm开发·stm32·单片机·嵌入式硬件
手打猪大屁2 天前
ARM裸机开发——I.MX6U_汇编LED灯驱动
汇编·arm开发
深圳信迈科技DSP+ARM+FPGA2 天前
基于ARM+FPGA+DSP的储能协调控制器解决方案,支持国产化
arm开发·fpga开发·信号处理
承接电子控制相关项目2 天前
STM32F103 单片机(基于 ARM Cortex-M3 内核)的启动过程涉及硬件初始化、固件配置和程序执行流程。
arm开发·stm32·单片机·cortex-m3内核启动
技术领导力2 天前
事关数据安全,ARM被爆不可修复漏洞
arm开发
完成大叔2 天前
嵌入式:ARM公司发展史与核心技术演进
arm开发·嵌入式硬件
木木不迷茫(˵¯͒¯͒˵)3 天前
Keil MDK‑5 中使用 GNU ARM GCC 的 -Wno-* 选项屏蔽编译警告
arm开发·gnu·keil
迷路的小灰仔3 天前
ESP32 搭建IDF+Vscode环境(详细教程)
c语言·arm开发·单片机·mcu·物联网·visual studio·iot