这个
#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) 我想做的是:
这应该在 bash 脚本中完成。
我试过了:
./script&
pid=$!
sleep 10
echo $string > /proc/${pid}/fd/0
Run Code Online (Sandbox Code Playgroud)
它确实在 shell 中工作,但当我在脚本中运行它时就不行了。
使用 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) 看来,无论我如何填充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?
我正在阅读一本旧书“ 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++ 风格的要点(视频)中,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)
工作正常。
#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) snake_case似乎是我遇到的大多数C源代码中的惯例.camelCase更适合打字.有没有理由不使用camelCase而不是snake_case?
我认为问题的根源可能是标识符倾向于"泄漏"到文件系统上(就像在标识符后面命名文件一样),而某些文件系统可能无法很好地处理区分大小写的名称.但这仍然是2015年平台上值得移植的东西吗?
是否有可能有一个函数模板,它将获取"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)
不使用堆.
这是来自 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 个参数。
这似乎没有用。这些动作有什么作用吗?