小编sin*_*oth的帖子

如何将一个常量数组文字传递给一个不使用变量C/C++的指针函数?

如果我有一个看起来像这样的原型:

function(float,float,float,float)
Run Code Online (Sandbox Code Playgroud)

我可以传递这样的值:

function(1,2,3,4);
Run Code Online (Sandbox Code Playgroud)

所以,如果我的原型是这样的:

function(float*);
Run Code Online (Sandbox Code Playgroud)

有什么办法可以达到这样的目的吗?

function( {1,2,3,4} );
Run Code Online (Sandbox Code Playgroud)

只是在没有创建临时变量的情况下寻找一种懒惰的方法,但我似乎无法确定语法.

c c++ function

29
推荐指数
3
解决办法
3万
查看次数

如何投射sockaddr_storage并避免违反严格别名规则

我正在使用Beej的网络指南,并遇到了一个别名问题.他提出了一个函数来返回特定结构的IPv4或IPv6地址:

1  void *get_in_addr( struct sockaddr *sa )
2  {
3      if (sa->sa_family == AF_INET)
4        return &(((struct sockaddr_in*)sa)->sin_addr);
5      else
6        return &(((struct sockaddr_in6*)sa)->sin6_addr);
7  }
Run Code Online (Sandbox Code Playgroud)

这会导致GCC 在第3行为sa吐出严格别名错误.据我所知,这是因为我这样调用这个函数:

struct sockaddr_storage their_addr;
...
inet_ntop(their_addr.ss_family,
          get_in_addr((struct sockaddr *)&their_addr),
          connection_name,
          sizeof connection_name);
Run Code Online (Sandbox Code Playgroud)

我猜测别名与their_addr变量是类型的事实有关,sockaddr_storage而另一个不同类型的指针指向同一个内存.

就是要解决这个症结的最佳方式sockaddr_storage,sockaddr_in以及sockaddr_in6组成工会?看起来这应该是网络中的一个很好的领域,我只是找不到任何有最佳实践的好例子.

此外,如果有人能够准确解释别名问题发生的位置,我会非常感激.

c sockets strict-aliasing pointer-aliasing

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

尝试通过ResourcesPlugin获取工作区时,"Workspace已关闭"异常

尝试通过ResourcesPlugin获取工作区时出现此错误:

java.lang.IllegalStateException: Workspace is closed.
at org.eclipse.core.resources.ResourcesPlugin.getWorkspace(ResourcesPlugin.java:339)
Run Code Online (Sandbox Code Playgroud)

生成它的代码是:

IWorkspace ws = ResourcesPlugin.getWorkspace();
Run Code Online (Sandbox Code Playgroud)

你能帮忙解决这个问题吗?

eclipse workspace resources plugins

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

这个指针演员我做错了什么?

我正在为C++构建一个GUI类,并处理很多指针.一个示例电话:

mainGui.activeWindow->activeWidget->init();
Run Code Online (Sandbox Code Playgroud)

我的问题是我想将activeWidget指针转换为另一种类型. activeWidget的类型为GUI_BASE.派生自BASE我有其他类,如GUI_BUTTON和GUI_TEXTBOX.我想将activeWidget指针从GUI_BASE转换为GUI_TEXTBOX.我认为它看起来像这样:

(GUI_TEXTBOX*)(mainGui.activeWindow->activeWidget)->function();
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为编译器仍然认为指针是GUI_BASE类型.但是,以下位代码确实有效:

GUI_TEXTBOX *textbox_pointer;
textbox_pointer = (GUI_TEXTBOX*)mainGui.activeWindow->activeWidget;
textbox_pointer->function();
Run Code Online (Sandbox Code Playgroud)

我希望我的问题只是语法问题.谢谢您的帮助 :)

c++ pointers

3
推荐指数
2
解决办法
982
查看次数

在运行时向对象添加任意类型

在我们的应用程序中,我们有一个在运行时接收属性的对象 例如,要向对象添加浮点数:

my_object->f("volume") = 1.0f;
Run Code Online (Sandbox Code Playgroud)

检索卷的工作方式相同:

cout << my_object->f("volume") << endl;
Run Code Online (Sandbox Code Playgroud)

在内部,这由字符串映射到它们各自的类型.每种类型都有自己的访问方法和地图.它看起来像这样:

map<string, float> my_floats;
map<string, int> my_ints;
map<string, void *> my_void_pointers;
Run Code Online (Sandbox Code Playgroud)

哦,可怕的void *.有时我们需要向对象添加类或函数.我们没有为每种可能的类型设置单独的地图,而是选择了void *地图.我们遇到的问题是清理.目前,我们保留了void *指向这些"悬空"对象的每种类型的列表,并在必要时在这些单独的列表上调用清理函数.

我不喜欢必须使用void *它以及正确清理所需的所有额外注意力.有没有更好的方法在运行时在对象中存储任意类型,可以通过字符串映射访问,并仍然可以通过析构函数自动清理?

c++ pointers void-pointers

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