示例代码(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)
问题:
F打印为2147483648.000000,那么为什么F <= INT_MAX是真的?是否可以在编译时确定实现是否提供精确宽度的整数类型?示例代码(想要):
#include <stdint.h>
#if HAS_EXACT_WIDTH_INTEGER_TYPES
uint32_t i;
#else
/* handle the case */
#endif
Run Code Online (Sandbox Code Playgroud)
问题的原因:编写适应性强的代码,如果实现不提供精确宽度的整数类型,则不会导致编译时错误。
如果违反了“应该/不应该”的要求,那么该要求位于哪个部分(例如语义、约束)是否重要?
问题原因: 本意见:
这是标准的语义部分,而不是约束,因此不需要诊断。
违反语义部分中的“应/不应”要求是否不需要诊断?
考虑这个代码(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)
问题:
nonstandard extension,那么为什么符合标准的 gcc / clang 什么也没说?后续问题:clang: <string literal> + <expression returns int> 导致混淆警告:将 'int' 添加到字符串不会附加到字符串。
“严格符合程序”+ 没有扩展是否意味着“没有发出诊断信息”?
原因:更好地理解术语“严格遵守程序”。
我nullptr在一行 C 代码中包含了一个检查。编译器 (gcc) 在使用-std=c17以及-std=gnu17.
在现代 C 标准中是否有 nullptr(或等效的)这样的东西?(C11, C17)
如果不是,那为什么呢?
简单的问题:如果一元运算符的优先级接近最高,那么为什么#and##运算符的计算顺序是未指定的?与 C 和 C++ 相关。
C11(6.10.3.2 # 运算符):
# 和 ## 运算符的计算顺序未指定。
C++,N4713(19.3.2 # 运算符):
# 和 ## 运算符的计算顺序未指定。
上下文:C 编译器在实现一致的同时故意不支持某些功能。可以吗?
\n一些例子。下面的所有编译器都是一致的实现(__STDC__定义为1)。然而:
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
msvc 不支持#pragma STDC FP_CONTRACT,而是支持它自己的版本#pragma fp_contract ( { on | off } )。但是,标准版本是#pragma STDC FP_CONTRACT { ON | OFF | DEFAULT }.
Cygwin 上的 gcc:sscanf 不处理十六进制浮点输入。libc 是标准的一部分。
\n问题:是否允许实现故意提供有限的功能(或其自己的此类功能版本),同时仍然符合实现? …
ISO 9899:2018已经有一段时间可以从ISO获得.变更清单:
非正式地,这个版本的标准已被称为C17一段时间,但ISO文件将是9899:2018.所以我想知道我们应该把它叫做C17还是C18.
为了不引起基于意见的答案,我的问题是:有哪些规范来源将此标准标记为"C17"或"C18"?
最规范的来源当然是ISO标准本身.鉴于此,为了保持一致性,标准应称为C18:
它发布于2018年,而不是2017年.所以我认为我们应该称它为C18?
虽然作为另一个例子,我知道的gcc创造了一个编译器开关-std=c17,根据此.gcc手册有点规范.他们打算保留这个名字吗?那些像clang和icc这样的人呢?
有一些共识吗?委员会的意见?
我注意到C ++ 17中的许多新功能来自C17。两种标准之间有关系吗?C函数和它们的C ++等效项之间是否有实际区别?
我正在尝试以可移植的方式使这种动态重新分配工作。
我的程序接受用户的一行文本并将其附加到缓冲区。如果缓冲区中的文本长度为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)