如果我使用“GCC警告我”,是否有选项=+&引用;而不是",+=&引用;操作人员

如果我使用“GCC警告我”,是否有选项=+&引用;而不是",+=&引用;操作人员,c,gcc,C,Gcc,例如: #include <stdio.h> #define TS_SIZE 188 int main(void) { volatile int offset = 0; volatile int len = 10; for (int i=0; i < len; i++) { offset =+ TS_SIZE; /* This should be += */ } printf("Offset

例如:

#include <stdio.h>
#define TS_SIZE 188

int main(void)
{
    volatile int offset = 0;
    volatile int len = 10;

    for (int i=0; i < len; i++)
    {
        offset =+ TS_SIZE; /* This should be += */
    }
    
    printf("Offset: %d \n", offset);
    return 0;
}
#包括
#定义TS_尺寸188
内部主(空)
{
易失性整数偏移=0;
volatile int len=10;
对于(int i=0;i
尝试了“
-Wall
-Wextra
和,
-pedantic
”,即使在godbolt编译器浏览器上使用最新的GCC(10.x)也不走运

注:
这只是一个小的人工示例代码。使用Volatile的原因显而易见。

早上好!我相信GCC中没有任何选项可以做到这一点。。。因为不需要那种东西!“=+”是C语言中的一个运算符,编译器不能为运行良好的某些内容提供错误或警告。您可以在StackOverflow中阅读有关“+=”和“=+”之间差异的说明。祝你好运

这实际上不是编译器的工作。编译器会检查您的代码是否有效,然后将源代码翻译成目标系统的机器代码

然而,编译器在过去几年中变得越来越友好,有时会对常见的bug、定义不清的行为或其他潜在的运行时错误行为发出警告。这种友好不应该被误认为是编译器将捕获所有此类bug的某种保证

虽然编译器倾向于对
if(a=b)
发出警告,但带有最大警告的gcc甚至不会对一些明显的事件发出警告,例如
int-arr[2];arr[2]=1(克朗和国际商会有)。正如您所注意到的,
=+
=等等

解决这个问题的办法是建立一个软件质量体系,该体系涵盖尽可能多的已知问题。不仅仅是依靠编译器警告,而是要成为一名专业的软件工程师。这意味着编码风格指南、使用安全C子集的编码标准、静态分析工具、代码“美化器”和同行代码评审

静态分析器可以发现编译器没有查找的许多bug,但可能不是这个特定bug,除非您显式地将其配置为查找它。编码标准+代码美化器应该将代码转换为
offset=+TS\u大小之后,手动代码检查将很容易发现错误



编辑:正如评论中指出的,
=+
在早期的K&R版本中曾经是有效的C。这里有一些历史教训:,请特别参阅Jonathan Leffler的精彩答案。

为什么您希望GCC警告完全有效的代码?在这种情况下,请使用grep!我相信
如果(a=b)
也是有效代码,但是…@thakeenathees:很多警告都是针对有效代码的。对于无效代码,我们需要一个错误。警告是针对“这在技术上是允许的,但您可能犯了错误”。琐事警报:很久以前(我说的是1970年代),
=+
是正确的编写方式,但存在解析歧义,因此它被改为
+=
。但有一段时间,为了向后兼容,编译器接受了
=+
,并对此发出了警告,这正是kamilz现在想要的。尽管如此,Clang还是发出了警告:“警告:使用可能用作复合赋值的一元运算符”(a)
=+
不是标准C中的运算符。C 2018 6.4.6 1中列出了
+=
而非
=+
作为运算符出现的标点或标记。(b) 编译器可以为具有完全由C标准定义的行为的代码提供警告。C 2018注释9说:“当然,只要有效程序仍然正确翻译,实现可以自由生成任意数量的诊断消息,通常称为警告。”附录I列出了通常由C实现生成的警告,即使没有任何警告被指定为标准的一部分。