问题标签 [c17]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 如果一元运算符的优先级接近最高,那么为什么 # 和 ## 运算符的求值顺序未指定?
#
简单的问题:如果一元运算符的优先级接近最高,那么为什么和运算符的评估顺序##
未指定?与 C 和 C++ 相关。
C11(6.10.3.2 # 运算符):
# 和 ## 运算符的求值顺序未指定。
C++,N4713(19.3.2 # 运算符):
# 和 ## 运算符的求值顺序未指定。
c - 是否有一种标准方法可以保证在编译(翻译)时评估某个(常量)表达式?
我很惊讶 C 不能保证在编译(翻译)时评估某些(常量)表达式。
C11(6.6 常量表达式)(强调):
可以在翻译期间而不是运行时评估常量表达式,...
因此,有两个问题:
- 是否有一种标准方法可以保证在编译(翻译)时评估某个(常量)表达式?
- 额外的问题:为什么C不保证呢?保证它的(技术)障碍是什么?
c - 是否有一种标准方法可以在编译时检查该文件是否仅被预处理?
__MY_CC__
上下文:不支持除此之外的所有编译器。但是,如何只允许使用第 3 方编译器进行预处理?
UPD。我试图解决的根本问题:
考虑名为
t0.c
.要求
t0.c
:一个。
t0.c
允许仅使用编译器进行my_cc
编译。不支持其他编译器(因为t0.c
包含特定于目标的代码)。湾。
t0.c
还包含一些元信息。元信息在t0.c
预处理后可用。C。元信息将在没有
my_cc
编译器的环境中使用。(这意味着它t0.c
不仅被设计为编译,而且只是被预处理,即不执行后续翻译阶段。)因此,t0.c
需要允许使用任何符合要求的实现(以下称为cc
)进行预处理,即不是my_cc
。如何满足这样的要求?
用户 Paul Hankin 提出了以下方法:
这段代码:
- 将与
my_cc
. 好的。 cc
由于语法错误(例如为 clang 给出),将不会与 一起编译:
好的。
使用生成的翻译单元进行预处理后,
cc -E
将包含"compiler not supported"
,这是不可取的,因为:一个。预计翻译单元不包含任何额外的开销(例如字符串)。
湾。它打破了要求:
cc -E
支持。
不好。
我们可以将 更改"compiler not supported"
为"compilation using non __MY_CC__ is not supported"
。但是,预计在t0.c
预先拥有之后,生成的翻译单元不包含任何额外的开销(例如字符串)。有没有无开销的解决方案?
c - C 标准的哪些部分证明了整数类型大小之间的关系?
在 C11 [C11_N1570]和 C17 [C17_N2176]的后期草稿中,我找不到以下证明(我相信,这是众所周知的):
sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
有人可以向我推荐特定的部分吗?
我知道 C++11 的这个回复。回复的第二部分谈到了 C,但只涉及values 的范围。它不能证明字体大小之间的比例。
formatting - 在 C17 中对齐/格式化输出值
视觉工作室 2019,C17
我无法弄清楚如何使用不同的输入数据获取示例中的输出。
c - printf("%a"): 十六进制浮点常量的格式和参数如何选择?
考虑这个简单的代码(t0.c):
调用和输出:
问题:对于转换说明符%a
,如何:
- 选择了十六进制浮点常量的确切格式,并且
- 这个十六进制浮点常数的参数选择?
例如,为什么0x1.2p-1070
而不是0x0.0000000000012p-1022
(或其他变体)(反之亦然)?
c - 术语“格式说明符”是术语“转换说明符”的同义词吗?
C11 和 C17 标准都使用术语“转换说明符”和“格式说明符”。它们是同义词吗?如果是,那么为什么要引入同义词?如果不是,那么它们之间有什么区别?
c - 是否有任何 C 编译器能够检测到违反“严格符合程序”的情况?
是否有任何 C 编译器能够检测*违反“严格符合程序”的情况?
* 在某些选项下,例如,--accept-only-strictly-conforming-program
如果不是,那么使用哪些工具来检测违反“严格符合程序”的情况?
信息丰富(C11, 4. 一致性,p5):
严格遵守的程序应仅使用本国际标准中指定的语言和库的那些特性。3) 它不应产生依赖于任何未指定、未定义或实现定义的行为的输出,并且不应超过任何最小实现限制。
c - 是否有标准方法来禁止读取(通过赋值)变量?
众所周知且有用的功能是:
const
类型限定符禁止写入(修改)变量register
存储类说明符禁止获取变量的地址
但是,是否有一种标准方法来禁止读取(通过赋值)变量?
例如,对于此类变量,仅允许写入和/或获取地址。
问题的原因:需要有条件地禁止读取(通过赋值)某些变量。该语言是否提供了任何方法来做到这一点?如果不是,那为什么?
UPD。读者可能也会感兴趣:C:在编译时或运行时检查变量是否具有静态存储类说明符。
c - C 函数声明链接
我对C17 标准中的一个主题有点困惑。
在 6.2.2 的第 5 点中,您可以阅读:
如果函数标识符的声明没有存储类说明符,则它的链接将完全确定,就好像它是使用存储类说明符 extern 声明的一样。[...]
这意味着它可以具有内部或外部链接,具体取决于该函数之前的其他声明(如果有)。
另一方面,在 6.7.6.3 示例 1(第 16 和 17 点)中,您可以阅读:
[...]
如果声明出现在任何函数之外,则标识符具有文件范围和外部链接。[...]
所以,没关系pfi
(它不是一个函数,而是一个指针),但是f
and会发生什么fip
?这不是矛盾吗?在 6.2.2 中,它“好像存在外部存储类说明符”(这并不总是意味着它将具有外部链接),但在 6.7.6.3 中,外部链接似乎是理所当然的。
我错过了什么?
编辑:更具体地说,如果我们在文件范围内有此代码:
6.2.2 声明第二个声明具有内部链接。
6.7.6.3 声明第二个声明具有外部链接。