小编fra*_*ian的帖子

当std :: fprintf(stderr,...)失败时,操作是否无效或者在失败之前可以写一点?

我有一个C++ 11程序,用于std::fprintf写入stderr日志和调试信息.我知道fprintf可以失败并返回负值,但我无法找到操作是否为原子(如果失败,没有效果),或者它可以写入文本的某些部分然后失败(或任何其他副作用).

使用的函数fprintf如下所示:

void writeToConsole (std::string const &message)
{
    std::fprintf(stderr, "%s\n", message.c_str());
}
Run Code Online (Sandbox Code Playgroud)

我正在Linux上开发使用Clang和GCC(现在),但我的问题更多是关于标准,所以......

题:

如果std::fprintf失败,仍有可能写入某些字符stderr?此行为是C/C++标准还是实现定义的?

更重要的是,如果std::fprintf失败,我应该中止该程序还是可以在没有副作用的情况下静默执行(除了不可能写入stderr)?

c++ printf c++11

12
推荐指数
2
解决办法
484
查看次数

增量算子的原子性

我在接受采访时告诉我,在C语言中,使用++运算符(比如说i ++)是一个原子操作,而不是"i + = 1".我认为这些操作在线程安全性或原子性方面完全相同.我错过了什么或者这些实际上是不同的吗?

c atomic atomicity language-lawyer

6
推荐指数
2
解决办法
266
查看次数

C99 VLA 大小确定和 sizeof 运算符

我写了以下内容作为关于的问题的答案的一部分sizeof,以及它在 C99 VLA 方面的行为:

有意创建一个案例,其中count_ofVLA的语义实际上不同,但创建一个可读、易于理解/可维护且有用的案例可能很困难(我还没有尝试过)。

仔细想想,我不确定这种说法是否属实。首先要创建 VLA,编译器必须首先确定 VLA 需要的空间量。

对于sizeof,我们知道

如果操作数的类型是变长数组类型,则对操作数求值;否则,不计算操作数并且结果是整数常量。(6.5.3.4/2)

尽管 VLA 大小显然是运行时确定的,但在对 VLA 声明符的大小表达式进行评估(如果有,包括任何副作用)之后:

可变长度数组类型的每个实例的大小在其生命周期内不会改变。如果大小表达式是 sizeof 运算符的操作数的一部分,并且更改大小表达式的值不会影响运算符的结果,则未指定是否计算大小表达式。(6.7.5.2/2)

所以,给定

#define count_of(arr)  (sizeof(arr)/sizeof(arr[0]))
Run Code Online (Sandbox Code Playgroud)

是否有任何其中一个宏这样的,因为这实际有效的行为可以为一个VLA与数组声明,其中阵列尺寸表达为常量表达式(即,普通老式预C99固定大小的数组)不同情况?

c language-lawyer

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

标签 统计

c ×2

language-lawyer ×2

atomic ×1

atomicity ×1

c++ ×1

c++11 ×1

printf ×1