当前位置: 首页 > 知识库问答 >
问题:

哪些是非ISO实践的例子,而这些都不是书呆子们发现的?

江德润
2023-03-14

https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html:

一些用户试图使用-Wpedantic来检查程序是否严格符合ISO C标准。他们很快发现它并没有达到他们想要的效果:它找到了一些非ISO实践,但不仅仅是ISO C要求诊断的那些实践,还有一些已经添加了诊断的实践。

-迂腐没有找到的非ISO实践示例有哪些?

共有3个答案

白驰
2023-03-14
  1. C预处理器,11.1实现定义的行为:

GCC允许标识符中的“$”字符作为大多数目标的扩展。无论std=开关如何,这都是正确的,因为此扩展不能与符合标准的程序冲突。但是,当预处理汇编器时,默认情况下美元不是标识符字符。

UPD。2.允许“普通<代码>复杂<代码>”:

#include <complex.h>
complex x;

$ gcc t0.c -std=c11 -pedantic -Wall -Wextra
<nothing>

C11,6.2.5类型,11:

有三种复合类型,分别为float\u complexdouble\u complex,和long double\u complex

和7.3.1引言,4:

复合体扩展为_复合体

UPD。3.\uuuu具有属性

#if __has_attribute(xxx)
#endif
int x;

$ gcc t0.c -std=c11 -pedantic -Wall -Wextra
<nothing>
邢寒
2023-03-14

GCC支持ISO C不要求的其他形式的常量表达式。例如:

int main() {
  const int m = 5;
  static int n = m;
  return n;
}

这段代码在“学究式”模式下编译得很好,即使静态变量是用不符合ISO C的常量表达式初始化的。

红弘盛
2023-03-14

这里的问题基本上是,编写包含错误的C程序(不仅仅是实现严格一致性的失败)是可能的,要求C编译器检测这些错误是不合理的。在最初编写标准时(1989年),整个程序分析是不可能的,即使是现在,它也很昂贵。一个人总是能够创造出这样的结构

extern _Bool collatz_sequence_does_not_terminate(int);
int foo(int n) {
    int rv;
    if (collatz_sequence_does_not_terminate(n)) {
        return rv;
    }
    return 23;
}

“这个程序是否有未定义的行为”的答案取决于解决方案未知的数学问题。

所以手册试图警告您,不仅GCC无法检测到所有可能违反ISO C一致性的行为,而且没有编译器可以。它的措辞有点过于精确,如果我仍然在GCC上工作,我可能会修改它以更清楚。

如果你想要一个具体的例子,说明程序不合格,根本没有被诊断出来,并且在现实生活中相对可能出现,试试这个大小:

/* a.c */
#include <stdint.h>
uint64_t val = 0x0123456789abcdef;

/* b.c */
#include <stdio.h>
extern double val;
int main(void) {
    printf("%g\n", val);
    return 0;
}

需要对整个程序进行分析,以检测两个文件之间的类型不匹配。这不是一个困难的案例;编译器可以用其类型注释每个全局符号,链接器可以检查每个符号的所有用法是否与定义一致。但我不知道有任何工具链,也没有任何静态分析产品,可以检测变量的这种错误。

 类似资料:
  • 每个人都知道饼干桶三角桩接龙游戏。你拿一个钉子,跳过另一个,跳进一个空洞,目标是只剩下一个钉子。 在游戏板对象的代码中,我有一个函数,它改变了你当前用来跳转的peg。为了解决这个问题,我将其连接到一个变量。每次你改变当前的钉住并使用它跳跃时,这算是一次移动。这是一个非常基本的启发式搜索算法,我希望是一个搜索算法:探索所有可能的跳跃可用一个peg。如果没有找到回溯的解决方案,请更新当前的peg并重复

  • 本文向大家介绍vue-router钩子函数有哪些?都有哪些参数?相关面试题,主要包含被问及vue-router钩子函数有哪些?都有哪些参数?时的应答技巧和注意事项,需要的朋友参考一下 全局的:beforeEach、beforeResolve、afterEach 路由的:beforeEnter 组件的:beforeRouteEnter、beforeRouteUpdate、beforeRouteLea

  • 问题内容: 对于Java的处理方式以及涉及到的数字和其他类型的数字,我有些困惑。例如: 输出(也许您应该先猜测一下): 这不能编译是可以预料的,是不同的对象。 令我有些惊讶的是,默认情况下9是an ,并且1)甚至没有编译。请注意,您不能将放入期望使用的方法中,但是在这里它们是相等的。 由于两个相同的原因,这令人惊讶,但似乎更糟。 不足为奇,因为自动装箱到和。 不足为奇,因为不同类中的对象不应该是。

  • 本文向大家介绍label都有哪些作用?并举相应的例子说明相关面试题,主要包含被问及label都有哪些作用?并举相应的例子说明时的应答技巧和注意事项,需要的朋友参考一下 lable可以关联控件,可以和表单元素结合,使表单元素获得焦点。有两个属性,for和accesskey。 for 属性用来关联表单,accesskey属性设置快捷键。 for属性: accesskey属性:

  • 我有问题,因为我想在内部包围一些,所以我需要知道。 哪些DOM元素可以是tr的子元素?(我知道div不能。)

  • 在Camunda7.8中,我知道如何使用rest API POST/task为给定进程获取活动任务。