小编PSk*_*cik的帖子

`std :: terminate`如何知道特别处理`std :: exception`s?

这个

#include <stdexcept>
struct A /*: public std::exception*/ {
  const char* what() const noexcept { return "this is A";  } 
};
int main(){
  throw A{};
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

给我(上stderr):

terminate called after throwing an instance of 'A'
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)

如果我取消注释,死亡消息将变为:

terminate called after throwing an instance of 'A'
what():  this is A
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)

怎么std::terminate知道std::exception特别对待s?

我怎么能在自己的模仿中做到这一点set_terminate?我试过了

//...
int main(){
  std::set_terminate([](){
      printf("exception thrown\n");
      std::exception_ptr eptr = std::current_exception();
      std::exception* ptr =  dynamic_cast<std::exception*>(eptr); …
Run Code Online (Sandbox Code Playgroud)

c++

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

启动进程后 10 秒如何在 bash 中发送到 stdin?

我想做的是:

  • 运行一个进程
  • 等待 10 秒
  • 向进程的标准输入发送一个字符串

这应该在 bash 脚本中完成。

我试过了:

./script&
pid=$!
sleep 10
echo $string > /proc/${pid}/fd/0
Run Code Online (Sandbox Code Playgroud)

它确实在 shell 中工作,但当我在脚本中运行它时就不行了。

linux bash

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

将 stringstream 替换为 cout

使用 glibc 的 stdio,我可以将 memstream 替换为 stdout,从而捕获编译后输出到 stdout 的一段代码的输出:

#include <stdio.h>

void swapfiles(FILE* f0, FILE* f1){ FILE tmp; tmp = *f0; *f0 = *f1; *f1 = tmp; }

void hw_c(){ puts("hello c world"); }

int c_capt(){
  FILE* my_memstream;
  char* buf  = NULL;
  size_t bufsiz = 0;

  if( (my_memstream = open_memstream(&buf, &bufsiz)) == NULL) return 1;

  FILE * oldstdout = stdout;

  swapfiles(stdout, my_memstream);
  hw_c();
  swapfiles(stdout, my_memstream);

  fclose(my_memstream);
  printf("Captured: %s\n", buf);
}
Run Code Online (Sandbox Code Playgroud)

我很好奇 是否也可以这样做iostreams。我天真的尝试无法编译:

#include <iostream>
#include <string>
#include <sstream> …
Run Code Online (Sandbox Code Playgroud)

c++ iostream

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

Linux 上的 0x4000000 sigaction 标志是什么?

看来,无论我如何填充struct sigaction对 sigaction 函数的 set 调用,该.sa_flags成员都会与 进行 OR 运算 0x4000000,或者至少如果我稍后使用 检索处置,那么我会这样得到它sigaction(Signum, NULL, &sa)

sigaction 的联机帮助页列出了以下 ORable 值.sa_flags

SA_NOCLDSTOP
SA_NOCLDWAIT
SA_NODEFER
SA_ONSTACK
SA_RESETHAND
SA_RESTART
SA_SIGINFO
Run Code Online (Sandbox Code Playgroud)

0x4000000与上面的每一项都与 0 进行与运算。什么是0x4000000

c linux signals

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

通过*指针分配后,相邻的内存空间将填充为零。为什么?

我正在阅读一本旧书“ The C Programming Language”来学习C,并且目前正在尝试使用指针。

#include <stdio.h>
int
main (void)
{
    // init string
    char s[8] = "ZZZZZZZ";
    // it goes: Z Z Z Z Z Z Z \0

    long *p;         // make pointer refering to the same adress as s
    p = s;           // but declared long for modifying 4 bytes at once
    *p = 0x41414141; // and assign hexadecimal constant equal to 65 65 65 65

    // expect output to be: AAAAZZZ
    printf ("%s\n", s);
    // but get …
Run Code Online (Sandbox Code Playgroud)

c

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

C++11 自动变量

现代 C++ 风格的要点(视频)中,Herb Sutter 提倡:

auto varname = Constructor{ ... };
Run Code Online (Sandbox Code Playgroud)

代替

Constructor varname( ... );
Run Code Online (Sandbox Code Playgroud)

我试着做:

auto log = fstream{"log.txt", fstream::out};
Run Code Online (Sandbox Code Playgroud)

但收到一条g++4.8 -std=c++11关于已删除函数的错误消息(无论我使用大括号还是圆括号)。

是我的错还是g++的错?

fstream log{"log.txt", fstream::out};
Run Code Online (Sandbox Code Playgroud)

工作正常。

MCVE:

#include <fstream>

using namespace std;
int main(int argc, char **argv)
{
    auto log = fstream{"log.txt", fstream::out};
    //fstream log{"log.txt", fstream::out};
    log << "hello world" << endl;
}
Run Code Online (Sandbox Code Playgroud)

错误:

g++ -std=c++11    1.cc   -o 1
1.cc: In function ‘int main(int, char**)’:
1.cc:6:47: error: use of deleted function ‘std::basic_fstream<char>::basic_fstream(const std::basic_fstream<char>&)’ …
Run Code Online (Sandbox Code Playgroud)

c++ c++11

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

camelCase vs C/C++标识符和文件名中的snake_case

snake_case似乎是我遇到的大多数C源代码中的惯例.camelCase更适合打字.有没有理由不使用camelCase而不是snake_case?

我认为问题的根源可能是标识符倾向于"泄漏"到文件系统上(就像在标识符后面命名文件一样),而某些文件系统可能无法很好地处理区分大小写的名称.但这仍然是2015年平台上值得移植的东西吗?

c c++

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

评估一段ex源代码

如果我有一个多行的 vimscript,例如,在剪贴板中,我如何评估它?

除了保存并获取保存的文件之外,还有其他方法吗?

vim

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

用于将字符串文字转换为std :: array的函数模板

是否有可能有一个函数模板,它将获取"string literal"并返回std::array<char,N>等效的

 char array[] = "string literal";
Run Code Online (Sandbox Code Playgroud)

我正在包装POSIX API,我想要一个mkstemp函数模板,它将获取字符串文字并返回

std::pair<
 ModifiedLiteral //template turned into actual name (probably in std::array)
,FileFd_RW       //My fd wrapper
>;
Run Code Online (Sandbox Code Playgroud)

不使用堆.

c++ c++11

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

在 MUSL 的 x86_64 __syscall_cp_asm 包装器中的系统调用之前,在堆栈上保存传入 pthread 地址的目的是什么?

这是来自 musl 的源代码:

 1  __syscall_cp_asm:
 2  __cp_begin:
 3      mov (%rdi),%eax
 4      test %eax,%eax
 5      jnz __cp_cancel

 6      mov %rdi,%r11

 7      mov %rsi,%rax
 8      mov %rdx,%rdi
 9      mov %rcx,%rsi
10      mov %r8,%rdx
11      mov %r9,%r10
12      mov 8(%rsp),%r8
13      mov 16(%rsp),%r9

14      mov %r11,8(%rsp)

15      syscall
16  __cp_end:
17      ret
18  __cp_cancel:
19      jmp __cancel
Run Code Online (Sandbox Code Playgroud)

我很好奇第 6 行和第 14 行的目的是什么(从链接的来源重新编号)。

根据我的理解,代码的开头测试了作为第一个参数传递的指针的目标(第 3-5 行),然后第 6 行将指针移动到r11,第 14 行然后将它移动到使用的堆栈上的位置传递第 7 个参数。

这似乎没有用。这些动作有什么作用吗?

assembly x86-64 musl

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

标签 统计

c++ ×5

c ×3

c++11 ×2

linux ×2

assembly ×1

bash ×1

iostream ×1

musl ×1

signals ×1

vim ×1

x86-64 ×1