标签: c17

如果 'float'<= INT_MAX 为真,那么为什么 (int)'float' 可能会触发未定义的行为?

示例代码(t0.c):

#include <stdio.h>
#include <limits.h>

#define F 2147483600.0f

int main(void)
{
        printf("F            %f\n", F);
        printf("INT_MAX      %d\n", INT_MAX);
        printf("F <= INT_MAX %d\n", F <= INT_MAX);
        if      ( F <= INT_MAX )
        {
                printf("(int)F       %d\n", (int)F);
        }
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

调用:

$ gcc t0.c && ./a.exe
F            2147483648.000000
INT_MAX      2147483647
F <= INT_MAX 1
(int)F       2147483647

$ clang t0.c && ./a.exe
F            2147483648.000000
INT_MAX      2147483647
F <= INT_MAX 1
(int)F       0
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 如果F打印为2147483648.000000,那么为什么F <= INT_MAX是真的?
  2. 在这里避免UB的正确方法是什么? …

c type-conversion undefined-behavior c11 c17

3
推荐指数
1
解决办法
123
查看次数

是否可以在编译时确定实现是否提供精确宽度的整数类型?

是否可以在编译时确定实现是否提供精确宽度的整数类型?示例代码(想要):

#include <stdint.h>

#if HAS_EXACT_WIDTH_INTEGER_TYPES
uint32_t    i;
#else
/* handle the case */
#endif
Run Code Online (Sandbox Code Playgroud)

问题的原因:编写适应性强的代码,如果实现不提供精确宽度的整数类型,则不会导致编译时错误。

c stdint c11 c17

2
推荐指数
1
解决办法
47
查看次数

如果违反了“应当/不得”要求,那么该要求位于哪个部分(例如语义、约束)是否重要?

如果违反了“应该/不应该”的要求,那么该要求位于哪个部分(例如语义、约束)是否重要?

问题原因: 本意见:

这是标准的语义部分,而不是约束,因此不需要诊断。

违反语义部分中的“应/不应”要求是否不需要诊断?

c standards-compliance language-lawyer c11 c17

2
推荐指数
1
解决办法
150
查看次数

哪些 C 规则允许在函数声明器中使用以前定义为类型的标识符?

考虑这个代码(t0.c):

typedef int T;
void f(int T);
Run Code Online (Sandbox Code Playgroud)

调用:

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

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

cl /std:c11 /Za /c t0.c
t0.c(2): warning C4224: nonstandard extension used: formal parameter 'T' was previously defined as a type
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 哪些 C 规则允许在函数声明器中使用以前定义为类型的标识符?
  2. 如果 msvc 说nonstandard extension,那么为什么符合标准的 gcc / clang 什么也没说?

c language-lawyer function-declaration c11 c17

1
推荐指数
1
解决办法
60
查看次数

1
推荐指数
1
解决办法
70
查看次数

在现代 C 标准中是否有 nullptr(或等效的)这样的东西?

nullptr在一行 C 代码中包含了一个检查。编译器 (gcc) 在使用-std=c17以及-std=gnu17.

在现代 C 标准中是否有 nullptr(或等效的)这样的东西?(C11, C17)

如果不是,那为什么呢?

c c17

1
推荐指数
2
解决办法
128
查看次数

如果一元运算符的优先级接近最高,那么为什么 # 和 ## 运算符的计算顺序未指定?

简单的问题:如果一元运算符的优先级接近最高,那么为什么#and##运算符的计算顺序是未指定的?与 C 和 C++ 相关。

C11(6.10.3.2 # 运算符):

# 和 ## 运算符的计算顺序未指定。

C++,N4713(19.3.2 # 运算符):

# 和 ## 运算符的计算顺序未指定。

c c++ language-lawyer c++17 c17

0
推荐指数
1
解决办法
74
查看次数

不支持的标准功能是否会影响一致性?

上下文:C 编译器在实现一致的同时故意不支持某些功能。可以吗?

\n

一些例子。下面的所有编译器都是一致的实现(__STDC__定义为1)。然而:

\n
    \n
  • gcc 不支持#pragma STDC FENV_ACCESS并出现问题warning: ignoring \xe2\x80\x98#pragma STDC FENV_ACCESS\xe2\x80\x99 [-Wunknown-pragmas]。然而, fenv.h 是一个标准头文件,#pragma STDC FENV_ACCESS ON标准要求支持 ,因为是on-off-switch :ON中的选择之一。ON OFF DEFAULT

    \n
  • \n
  • msvc 不支持#pragma STDC FP_CONTRACT,而是支持它自己的版本#pragma fp_contract ( { on | off } )。但是,标准版本是#pragma STDC FP_CONTRACT { ON | OFF | DEFAULT }.

    \n
  • \n
  • Cygwin 上的 gcc:sscanf 不处理十六进制浮点输入。libc 是标准的一部分。

    \n
  • \n
\n

问题:是否允许实现故意提供有限的功能(或其自己的此类功能版本),同时仍然符合实现? …

c standards-compliance language-lawyer c11 c17

0
推荐指数
1
解决办法
99
查看次数

我们应该称它为C17还是C18?

ISO 9899:2018已经有一段时间可以从ISO获得.变更清单:

什么是C17以及该语言有哪些变化?

非正式地,这个版本的标准已被称为C17一段时间,但ISO文件将是9899:2018.所以我想知道我们应该把它叫做C17还是C18.

为了不引起基于意见的答案,我的问题是:有哪些规范来源将此标准标记为"C17"或"C18"?

最规范的来源当然是ISO标准本身.鉴于此,为了保持一致性,标准应称为C18:

  • C90 = 9899:1990
  • C99 = 9899:1999
  • C11 = 9899:2011
  • C1x = 9899:2018

它发布于2018年,而不是2017年.所以我认为我们应该称它为C18?

虽然作为另一个例子,我知道的gcc创造了一个编译器开关-std=c17,根据.gcc手册有点规范.他们打算保留这个名字吗?那些像clang和icc这样的人呢?

有一些共识吗?委员会的意见?

c c11 c17

-1
推荐指数
1
解决办法
1385
查看次数

C ++ 17是基于C17的吗?

我注意到C ++ 17中的许多新功能来自C17。两种标准之间有关系吗?C函数和它们的C ++等效项之间是否有实际区别?

c c++ language-lawyer c++17 c17

-1
推荐指数
2
解决办法
309
查看次数

Windows内存格式化问题

我正在尝试以可移植的方式使这种动态重新分配工作。

我的程序接受用户的一行文本并将其附加到缓冲区。如果缓冲区中的文本长度为20个或更多,它将删除前20个字符,并将其后的所有字符移到缓冲区的开头。

我有这段代码可以在Linux上正常工作,但是当我在Windows上运行它时会发出垃圾。有谁知道为什么/如何仅使用malloc使其具有可移植性。IE浏览器不使用string.h(strcpy)的str ...除了伦。

仅限于c17-无折断的钉子(不可移植)。这是我的代码。编译无误gcc 7.3,mingw 7.3。我用更安全的功能替换了gets和puts函数,但在Windows上仍然出现垃圾。我认为这是一个格式问题...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>

void wbuff (message)
    char *message;
{
    FILE *f = fopen("file.txt", "w");
    fprintf(f, "%s", message);
    fclose(f);
}

char *rean (message)
    char *message;
{
    /* performs (write) on buffer, trims lefover, then restores */

    char buf[80] = "";
    puts("enter a line");
    gets(buf);

    int bln  =  strlen( buf );
    int mln  =  strlen( message );
    int nln  =  bln + mln;
    printf("new length %d\n", nln);

    message = realloc(message, …
Run Code Online (Sandbox Code Playgroud)

c malloc portability string.h c17

-9
推荐指数
1
解决办法
133
查看次数