小编Ale*_*x B的帖子

C++中的C99严格别名规则(GCC)

据我所知,GCC支持C++中的所有C99功能.但是如何在C++代码中处理C99严格别名?

我知道在不相关的类型之间使用C转换进行转换不是严格别名安全的,并且可能生成错误的代码,但是C++呢?由于严格别名不是C++标准的一部分(这是正确的吗?),GCC必须指定语义本身.

我想,const_caststatic_cast相关类型之间的演员阵容,因此他们是安全的,而reinterpret_cast可以打破严格走样规则.

这是正确的理解吗?

c c++ gcc strict-aliasing

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

"rdtsc"之前的"cpuid"

有时我会遇到使用rdtsc指令读取TSC的代码,但cpuid之前会调用.

为什么要打电话cpuid?我意识到这可能是与有TSC的值不同的内核,但什么究竟,当你调用序列这两个指令会发生什么?

x86 assembly rdtsc

18
推荐指数
2
解决办法
3826
查看次数

我如何解决Go没有参数多态?

我是Go新手,但我读过Go常规不会错过参数多态.每当我尝试学习一门新语言时,我都会使用L99问题列表来进行练习.

即使我尝试写一些像第一个问题一样简单(在Go中将是单个语句,取一个切片的最后一个元素),我将如何将其写为一个接受任何类型切片的函数(使用我上面引用的那个单一语句)返回该切片的最后一个元素?

我认为即使语言没有参数多态,也必须有一些惯用的"Go"方式,以便Go常规声称他们不会错过参数多态.否则,如果示例比例如列表的最后一个元素更复杂,则需要一个函数来为每个类型执行任务.

我错过了什么?

go parametric-polymorphism

18
推荐指数
2
解决办法
2867
查看次数

为什么git不会尝试将更改合并到重命名的文件?

假设我有一个文件

  1. 在master中修改
  2. 在功能分支中修改
  3. 在功能分支中重命名

当我尝试从master合并到功能分支时,合并失败

CONFLICT(修改/删除):在HEAD中删除X并在origin/master中修改.X的版本原点/主人在树中留下.

我知道存在冲突,但为什么不尝试合并更改并将冲突标记放在文件中?以前的答案似乎暗示它应该.我得到的是该文件的两个不同版本,我必须手动找出差异,并从主版本到我的版本逐行更改端口.

重现步骤:

git init
touch a
git add a
git commit -m 'initial import'

git checkout -b feature1
echo feature1 > a
git add a
git commit -m feature1
git mv a b
git commit -m feature1

git checkout master
echo bugfix > a
git add a
git commit -m bugfix

git checkout feature1 
git merge master 
Run Code Online (Sandbox Code Playgroud)

git merge

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

vim,ctags和同名的标识符

vim + ctags 适用于C项目,因为C不允许函数重载,并且通常鼓励由于基本的范围设施而手动添加符号.

在C++中,函数经常被重载,并在子类中被重写.这使得vim总是跳到错误的类中的标签上"Ctrl + ]".有没有办法让它表现得更智能一点?我知道我可以带一个带有标签替代品的列表,但是总是不得不提出这个列表并且每当我想跳到定义时按编号找到所需的标签是非常烦人的.

c++ vim ctags

17
推荐指数
4
解决办法
3048
查看次数

boost :: shared_ptr的no-op解除分配器

Boost中是否存在boost::shared_ptr用于静态对象的库存无操作解除分配器等.

我知道写它是非常简单的,但如果已经有一个可用的话,我不想把我的代码洒上额外的小函数.

c++ boost

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

recv()不会被多线程环境中的信号中断

我有一个阻塞recv()循环的线程,我想终止(假设这不能改为select()或任何其他异步方法).

我还有一个捕获的信号处理程序,SIGINT理论上它应该recv()返回错误并errno设置为EINTR.

但它没有,我认为这与应用程序是多线程的事实有关.还有另一个线程,同时在等待pthread_join()通话.

这里发生了什么事?

编辑:

好的,现在我recv()通过pthread_kill()主线程明确地将信号传递给所有阻塞线程(这导致SIGINT安装了相同的全局信号处理程序,尽管多次调用是良性的).但recv()呼叫仍然没有被阻止.

编辑:

我编写了一个代码示例来重现问题.

  1. 主线程将套接字连接到不会让连接进入的行为不当的远程主机.
  2. 所有信号都被封锁
  3. 读线程线程已启动.
  4. 主要解锁和安装处理程序SIGINT.
  5. 读线程解锁并安装处理程序SIGUSR1.
  6. 主线程的信号处理程序将a发送SIGUSR1到读取线程.

有趣的是,如果我取代recv()sleep()被中断就好了.

PS

或者,您只需打开UDP套接字而不是使用服务器.

客户

#include <pthread.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <errno.h>

static void
err(const char *msg)
{ …
Run Code Online (Sandbox Code Playgroud)

c sockets linux signals pthreads

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

加载具有不同版本的多个共享库

我在Linux上有一个可执行文件加载libfoo.so.1(即a SONAME)作为其依赖项之一(通过另一个共享库).它还链接到另一个系统库,而该系统库又链接到系统版本libfoo.so.2.其结果是, libfoo.so.1libfoo.so.2执行期间被加载,和这应该从库版本1调用函数代码结束调用从一个较新的系统库(二进制不相容)功能与第2版,因为一些符号保持不变.结果通常是堆栈粉碎和随后的段错误.

现在,链接旧版本的库是一个封闭源的第三方库,我无法控制libfoo它编译的版本.假设,剩下的唯一选择是重建当前链接的一堆系统库以libfoo.so.2进行链接libfoo.so.1.

有没有办法避免使用链接到旧版本的本地副本替换系统库libfoo?我可以加载两个库并让代码调用正确的符号版本吗?所以我需要一些特殊的符号级版本控制?

linux versioning gcc shared-libraries dynamic-linking

16
推荐指数
2
解决办法
7205
查看次数

C++类构造函数可以知道它的实例名称吗?

是否可以从类方法中知道对象实例名称/变量名称?例如:

#include <iostream>

using namespace std;

class Foo {
     public:
          void Print();
};

void Foo::Print() {
     // what should be ????????? below ?
     // cout << "Instance name = " << ?????????;
}

int main() {
    Foo a, b;
    a.Print();
    b.Print();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ constructor class instance

15
推荐指数
7
解决办法
7002
查看次数

C++异常处理和错误报告习语

在C++中,RAII经常被提倡作为异常处理的优秀方法:如果抛出异常,则堆栈被展开,所有析构函数都被调用,资源被清理.

但是,这会出现错误报告问题.假设一个非常通用的函数失败,堆栈被解开到顶层,我在日志中看到的只有:

无法从套接字读取:由对等方重置连接.

......或任何同样通用的信息.这并没有说明抛出异常的上下文.特别是如果我正在运行类似事件队列处理循环的东西.

当然,我可以用try/catch块包装每次调用套接字读取,捕获异常,构造一个带有更详细上下文信息的新内容并重新抛出它,但是它违背了使用RAII的目的,并且缓慢但肯定地变得比处理返回错误代码更糟糕.

在标准C++中详细报告错误报告的更好方法是什么?我也对涉及Boost的建议持开放态度.

c++ exception-handling

15
推荐指数
2
解决办法
4318
查看次数