相关疑难解决方法(0)

为什么要使用'extern'C++"'?

本文中,关键字extern后面可以跟"C"或"C++".为什么要使用'extern'C++"'?这是实用的吗?

c c++

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

C中的静态和外部有什么区别?

C staticexternC 之间有什么区别?

c

33
推荐指数
4
解决办法
7万
查看次数

通过易失性引用/指针访问声明的非易失性对象是否会在所述访问时赋予易失性规则?

这将是一个漫长的过程,关于它的上下文并提供尽可能多的信息,我必须通过各种链接和引用来蜿蜒 - 这通常是我们进入C/C++标准兔子洞后的唯一方法.如果您对此帖有更好的引用或任何其他改进,请告诉我.但是要事先总结,你可以责怪@ zwol发布这个;-)并且目的是从两个命题中找到真相:

  • 执行C和(通过导入;请参阅注释)C++标准要求访问通过volatile *volatile &必须引用最初声明的对象volatile才能具有volatile语义?
  • 或者volatile通过volatile指针/引用访问非限定对象足够/应该使所述访问行为就像声明对象一样volatile

无论哪种方式,如果(看起来)措辞与意图相比有些含糊不清 - 我们能否在标准本身中明确说明?

这些相互排斥的解释中的第一个更常见,而且并非完全没有依据.但是,我希望表明对第二个问题有很大的"合理怀疑" - 尤其是当我们回到基本原理和WG论文中的一些先前段落时.


接受的智慧:被引用的对象本身必须已被声明 volatile

昨天流行的问题是"挥发性"这个波动的定义,还是GCC有一些标准的合规性问题?通过假设一个volatile引用会赋予volatilevolatile指示物行为- 但发现它没有,或者在不同程度上以不可预测的方式发生行为而产生.

接受的答案最初得出结论,只有声明的指称类型才重要.这个和大多数评论似乎都同意我们所熟知的等效原则在起作用const:volatile如果引用与引用对象具有相同的cv -qualification,则行为将仅(或根本定义):

该段落中的关键词是对象.volatile sig_atomic_t flag;是一个易变的对象.*(volatile char *)foo仅仅是通过挥发性合格左值的访问,标准不要求具有任何特殊效果.- zwol

这种解释似乎得到了广泛的解释,正如对这个相似但希望不重复的问题的回答所示:指向易失性指向非易失性对象的行为要求但即使在那里也存在不确定性:答案是'不',然后说'也许'!无论如何......让我们检查一下标准,看看'不是'的基础.


标准所说的......或者不是

C11,N1548,§6.7.3:虽然很明显它是UB来访问一个定义 的对象volatileconst …

c c++ pointers volatile language-lawyer

26
推荐指数
2
解决办法
765
查看次数

将线程作为C++类的成员启动的最佳方法是什么?

我想知道启动一个C++类成员的pthread 的最佳方法是什么?我自己的方法作为答案......

c++ pthreads

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

lambda可以有外部"C"链接吗?

这似乎适用于我尝试过的平台:

#include <iostream>

// extern "C" linkage
extern "C" void foo(void (*fn_ptr)(int));

namespace {
  struct bar {
    static void f(int);
  };
}

int main() {
  // Usually works on most platforms, not guaranteed though:
  foo(bar::f);

  // Probably equally bad or worse?
  foo([](int x) { std::cout << x << std::endl; });
}
Run Code Online (Sandbox Code Playgroud)

但是当不需要时,再次传递一个静态成员函数也可以在这些平台上运行.

有没有办法强制lambda有合适的链接,使这个安全和便携?还是已经?

c++ lambda linkage c++11

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

如何将非静态成员函数作为回调传递?

 
io_iterator_t enumerator;
kern_return_t   result;
result = IOServiceAddMatchingNotification(
             mNotifyPort,
             kIOMatchedNotification,
             IOServiceMatching( "IOFireWireLocalNode" ),
             serviceMatchingCallback, 
             (void *)0x1234,
             & enumerator );

serviceMatchingCallback((void *)0x1234, enumerator);

如果我将serviceMatchinCallback声明为静态然后它可以工作,但我不希望它是静态的.有没有办法将它传递给非静态回调函数?

谢谢

c++ function callback member non-static

7
推荐指数
2
解决办法
7703
查看次数

C++类成员函数和来自C API的回调

我正在尝试学习如何write_data(…)funmain()类中的函数调用此函数,如下面的代码所示.(我知道如果我只列出这两个函数而不将它放在一个类中,这个程序就可以工作).

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data)line给了我错误,不允许我调用write_data(...)函数.你可以请更正我的代码并告诉我如何实现这一目标.任何帮助将不胜感激.谢谢.

error C3867: 'go_website::write_data': function call missing argument list; use '&go_website::write_data' to create a pointer to member
Run Code Online (Sandbox Code Playgroud)
//Microsoft Visual Studio 10 in C++
#define CURL_STATICLIB
#include <stdio.h>
#include <curl/curl.h>
#include <curl/types.h>
#include <iostream>
#include <curl/easy.h>
#include <string>
using namespace std;

extern "C" typedef size_t curl_write_callback(void *ptr, size_t size, size_t nmemb, FILE *stream);
class go_website
{
public:
static curl_write_callback write_data;

void funmain()
{
    CURL *curl;
    FILE *fp;
    CURLcode res;
    char *url = "http://www.shorturl.com/"; …
Run Code Online (Sandbox Code Playgroud)

c++ member-function-pointers callback member-functions

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