小编csh*_*shu的帖子

如果它调用共享库,C++中的无限循环仍然是未定义的行为吗?

据说无限循环for(;;);是未定义的行为.


来自http://en.cppreference.com/w/cpp/language/memory_model

在有效的C++程序中,每个线程最终都会执行以下操作之一:

  • 终止
  • 调用I/O库函数
  • 读取或修改易失性对象
  • 执行原子操作或同步操作

没有执行任何这些可观察的行为,任何执行线程都不能永远执行.

请注意,这意味着具有无限递归或无限循环的程序(无论是作为for语句实现还是通过循环goto或其他方式)具有未定义的行为.


但是如果它在共享库中调用函数呢?

for(;;) sofunc();

该函数可以执行任何类型的阻塞I/O或抛出异常.

在这种情况下,编译器是否假定循环具有一些可观察的行为?

c++ infinite-loop undefined-behavior

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

如何逐步看宏扩展?

似乎Eclipse允许用户通过按F2"逐步查看扩展".

我喜欢这个很棒的功能.但我可以用gccclang(或任何工具)做同样的事情吗?

-E选项使所有宏完全展开.所以我没有找到任何替代方法来逐步扩展宏.

Eclipse很大.我希望我不需要在任何地方安装它并一直启动它.

c c++ gcc compiler-options c-preprocessor

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

安全使用“setjmp”和“longjmp”

我知道人们总是说不要使用longjmp,它是邪恶的,它是危险的。

但我认为它对于退出深度递归/嵌套函数调用很有用。

是不是一次下单longjmp比多次重复检查和退货要快一些if(returnVal != SUCCESS) return returnVal;

至于安全性,只要动态内存等资源释放得当,应该不会有问题吧?

到目前为止,使用似乎longjmp并不困难,甚至使我的代码更简洁。我很想经常使用它。

(恕我直言,在许多情况下,首先在深度递归中没有分配动态内存/资源。深度函数调用对于数据解析/操作/验证来说似乎更常见。动态分配通常发生在更高级别,然后调用函数,其中setjmp出现。)

c performance memory-leaks setjmp

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

编译为C++而不是C(错误:左值作为一元'和'操作数)

当我使用C++时,这行编译,但不是C:

gmtime(&(*(time_t *)alloca(sizeof(time_t)) = time(NULL))); //make an lvalue with alloca

我对这种差异感到惊讶.甚至没有C++的警告.

当我指定时gcc -x c,消息是:

playground.cpp:25:8: error: lvalue required as unary '&' operand
 gmtime(&(*(time_t *)alloca(sizeof(time_t)) = time(NULL)));
        ^
Run Code Online (Sandbox Code Playgroud)

这不是&一个地址的运营商吗?为什么它在C和C++中有所不同?

虽然我可以在C中使用复合文字,但仍然可以修改我的语法以使其在C&C++中都有效吗?

c c++ compiler-errors rvalue lvalue

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

在推迟功能内是否可以恐慌,特别是当它已经恐慌时?

func sub(){
    defer func (){
        panic(2)
    }()
    panic(1)
}

func main(){
    defer func(){
        x:=recover()
        println(x.(int));
    }()
    sub()
}
Run Code Online (Sandbox Code Playgroud)

我尝试了这个代码,似乎第一次恐慌panic(1)被第二次恐慌简单地"覆盖"了panic(2).

但这样做可以吗?或者调用可能在延迟函数内发生恐慌的Golang函数?

(在C++中,从析构函数中抛出异常几乎是不可接受的.如果堆栈已经展开,它会终止程序.我不知道在Golang中是否会以类似的方式恐慌.)

go

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

抛出异常后,jshell继续执行我的脚本.怎么让它停下来?

我尝试编写一些jshell脚本.抛出异常时,jshell仍继续执行下一行.

如何让我的脚本更像普通的java程序?

编辑:我只是像运行它一样jshell SCR.jsh.

使用throw new Exception()1/0不阻止执行下一行.

该脚本包含如下语句:

System.out.println(1/0)
System.out.println("foo")
/exit
Run Code Online (Sandbox Code Playgroud)

我以为第二行无法访问.这就是我的预期.但在打印异常后,foo也会打印出来.

java java-9 jshell

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

C运算符结果类型

在C11(n1570)中,有一些运算符的结果类型已明确说明.例如,&&的结果具有int类型.但我还没有找到其他运算符的结果类型,比如+.它是在标准的某个地方指定的吗?

我试过这个程序:

unsigned char usc = 254;
unsigned int usi = 4294967293;
signed char sic = 126;
long long unsigned llu = usc*2;
printf("%llu\n",llu);
llu = usi*2;
printf("%llu\n",llu);
llu = usc+usc;
printf("%llu\n",llu);
llu = usi+usi;
printf("%llu\n",llu);
llu = usc+4294967294;
printf("%llu\n",llu);
llu = usc+2147483646;
printf("%llu\n",llu);
llu = sic+4294967294;
printf("%llu\n",llu);
llu = sic+2147483646;
printf("%llu\n",llu);
Run Code Online (Sandbox Code Playgroud)

输出:

508
4294967290
508
4294967290
4294967548
18446744071562068220
4294967420
18446744071562068092
Run Code Online (Sandbox Code Playgroud)

我想unsigned char在这里被提升,但是unsigned int没有; char + unsigned int的结果类型似乎是unsigned int,char + int的结果类型似乎是int.

但我不太确定.

这些铸件是标准的还是实施定义的?

c casting

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