小编nie*_*sen的帖子

为什么 C++ 中的临时结构成员没有预期的值?

考虑这段代码:

#include<iostream>

struct A
{
    int b;
};

int main()
{
    int c = (A() = A{2}).b;  // Why is c zero after this?
    std::cout << "c = " << c << std::endl;
    std::cout << "A.b = " << (A() = A{2}).b << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

在我看来,这是打印相同值的两种等效方法,但我得到了这个结果(在 MinGW 下的 GCC 7.3.0 上):

c = 0
A.b = 2
Run Code Online (Sandbox Code Playgroud)

我本来期望c是2。谁能解释为什么它是0?

c++ gcc

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

用于将字节序独立转换为大字节序的宏

是否可以编写一个C包含an uint32_t并将其转换为大端序表示的宏,而不管目标系统是小端还是大端序,以便可以在编译时为常量求值?

我发现了一个问题:字节序转换,无论字节序如何,但是答案仅提供了功能。我的情况是我希望编译时表达式能够编写如下内容:

const uint32_t magic_number = BIGENDIAN32(0x12345678);
Run Code Online (Sandbox Code Playgroud)

c endianness c11

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

为什么 tee 实现在退出时关闭 STDIN 和 STDOUT?

coreutils tee源代码在退出时关闭标准输入和输出:

int
main (int argc, char **argv)
{

   atexit (close_stdout);

   <......>

  ok = tee_files (argc - optind, &argv[optind]);
  if (close (STDIN_FILENO) != 0)
    die (EXIT_FAILURE, errno, "%s", _("standard input"));

  return ok ? EXIT_SUCCESS : EXIT_FAILURE;
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否有必要这样做,因为当tee程序终止时,STDINSTDOUT会被进程管理自动关闭。

这只是一个好的编码实践还是有一个用例?

c stdin gnu stdout atexit

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

哪个是最标准的:strnlen 或 strnlen_s?

在我当前的项目中,我根据 C11 标准(使用 构建gcc -std=c11)进行编码,并且需要类似的东西strnlen(“安全”版本strlen返回以 0 结尾的字符串的长度,但只能达到给定的最大值)。所以我查了一下(例如https://en.cppreference.com/w/c/string/byte/strlen),似乎 C11 标准提到了这样一个函数,但名称为strnlen_s.

因此我选择了strnlen_s,但是当包含string.h. 另一方面,strnlen是定义的,所以我目前的解决方案是使用strnlen一个注释,即标准名称似乎是strnlen_s,但这不是由 GCC 定义的。

问题是:我认为这strnlen是最可移植的名称是否正确,或者我可以做些什么使代码最可移植/标准?

注:微软(https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strnlen-strnlen-s)实现与区分这两种功能是strnlen_s检查字符串指针NULL,并返回0在这种情况虽然strnlen没有这样的检查。

c c11

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

标签 统计

c ×3

c11 ×2

atexit ×1

c++ ×1

endianness ×1

gcc ×1

gnu ×1

stdin ×1

stdout ×1