Tag: c ++ 11

创建线程时设置CPU关联

我想创建一个C ++ 11线程,我希望它在我的第一个核心上运行。 我发现pthread_setaffinity_np和sched_setaffinity可以改变线程的CPU亲和性并将其迁移到指定的CPU。 但是,在线程运行后,此关联性规范会发生更改。 如何创建具有特定CPU关联性的C ++ 11线程( cpu_set_t对象)? 如果在初始化C ++ 11线程时无法指定关联, 那么如何在C中使用pthread_t呢? 我的环境是Ubuntu上的G ++。 一段代码表示赞赏。

C ++ 11嵌套宏调用?

它在C ++ std 16.3.4中说: 重新扫描生成的预处理标记序列[来自宏调用替换]以及源文件的所有后续预处理标记,以替换更多的宏名称。 如果在替换列表的扫描期间(不包括源文件的其余预处理标记)找到要替换的宏的名称,则不会替换它。 此外,如果任何嵌套替换遇到要替换的宏的名称,则不会替换它。 这些未替换的宏名称预处理令牌不再可用于进一步替换,即使它们稍后(重新)检查在其中否则将替换该宏名称预处理令牌的上下文中。 什么是嵌套宏替换? 具体考虑: #define f(x) 1 x #define g(x) 2 x g(f)(g)(3) 我原以为是: g(f)(g)(3) <– first replacement of g, ok 2 f(g)(3) <– nested replacement of f, ok 2 1 g(3) <– second nested replacement of g, don't replace, stop 然而gcc意外地继续进行第二次替换g,产生: 2 1 2 3 有任何想法吗? 更新: 经过大量研究后,让我通过一个更简单的例子来解决这个问题: […]

如何在标准C / C ++中获取文件分隔符号:/或\?

我想写一个函数: inline char separator() { /* SOMETHING */ } 在标准C / C ++ / C ++ 11中返回系统的文件分隔符? (我的意思是斜杠或反斜杠取决于系统)。 有没有办法实现这个目标?

有什么不同? clang ++ | clang -std = c ++ 11

我错误地使用了这个在链接步骤失败的命令: $ clang -std=c++11 -stdlib=libc++ myInputFile.cpp 任何人都可以解释为什么clang提供了C ++语言选项,以及为什么它无法链接? 为什么选项-x c++或-std=c++11完成与clang++相同的操作? 谢谢!

使用C ++ 11中的智能指针包装旧C结构并自动释放它们

我正在使用Word-Net ,一个由普林斯顿大学在九十年代开发的旧C库。 该库是用C语言编写的,只显示标题但不显示其实际实现。 我使用的唯一结构是: SynsetPtr 我称之为的两个function是: findtheinfo_ds traceptrs_ds 这两个函数都返回一个SynsetPtr。 但是,当SynsetPtr表示感知列表时,我必须使用它来释放它 free_syns 然而,当SynsetPtr用于遍历链表(分层树)时,我必须使用它来释放它 free_synset 文档不清楚何时调用哪个,以及为什么。 这很快就成了我的噩梦。 我花了三天时间慢慢地通过泄漏,双重释放,内存分配等工作。 所以我想知道,有没有办法让我绕过这些函数或实际的结构,让C ++管理内存? 理想情况下,当没有更多对它们的引用时,我希望它们是免费的,就像std :: shared_ptr的情况一样。 这是可能的,知道Synset_Ptr没有析构函数,但是必须调用dealloc函数吗? 或者,我可以包围创建(分配)这些结构的两个函数,以某种方式预订对象,并在没有引用它们时销毁它们吗? 我真的很感激任何帮助! 编辑: 这是wn.h中SynsetPtr的确切声明 /* Structure for data file synset */ typedef struct ss { long hereiam; /* current file position */ int sstype; /* type of ADJ synset */ int fnum; /* […]

C99和C ++内联函数的兼容定义

我有一个由C ++ 11应用程序代码使用的C99代码实用程序库。 一些内联函数以C99样式声明,并在转换单元中显式生成代码,如: // buffer.h inline bool has_remaining(void* obj) { … } // buffer.c extern inline bool has_remaining(void * obj); 但是,当我尝试在C ++应用程序中使用has_remaining时,我在链接时遇到有关多个定义的错误。 似乎g ++正在实例化已经存在于库中的内联代码,尽管有extern “C” 标头保护说明符。 有没有办法强制g ++使用这种类型的定义? 看起来如果#ifdef __cplusplus是一个带有gnu_inline属性的extern定义,那么正确的事情就会发生,但是肯定有一种更便携的方式来保持现代C头与现代C ++兼容吗? – 编辑:工作示例 – buffer.h: #ifndef BUFF_H #define BUFF_H #include #include #ifdef __cplusplus extern “C” { #endif inline bool has_remaining(void const* const obj) { […]

将成员函数指针传递给c样式函数

我试图将成员函数指针传递给c风格的函数(因为它是C中的lib) 它想要的指针定义为: void (*)(int, const char*) 所以我试图传递的function是: void Application::onError(int error, const char *description) 我试图用这段代码传递: setCallback(bind(&Game::onError, this, placeholders::_1, placeholders::_2)); 这给了我以下错误: cannot convert ‘std::_Bind_helper<false, void (Application::*)(Application*, int, const char*), Application* const, const std::_Placeholder&, const std::_Placeholder&>::type {aka std::_Bind<std::_Mem_fn(Application*, std::_Placeholder, std::_Placeholder)>}’ to ‘GLFWerrorfun {aka void (*)(int, const char*)}’ for argument ‘1’ to ‘void (* glfwSetErrorCallback(GLFWerrorfun))(int, const char*)’ glfwSetErrorCallback(bind(&Application::onError, this, […]

C ++数组大小声明和const

我只是跳进C ++,来自C 在C(89/90)中, const实际上不是常量(与# #define , enum或literal相反),而是一旦设置为只读。 即,我可以: const int x = rand(); 这很好 – 直到运行时才知道x的点。 因此,我不能 int arr[x]; // error – x is not a compile-time constant 然后,C标准之一(99?)继续进行并允许可变长度数组。 虽然我通常使用C语言中的ANSI标准进行编码,但实际上这已经产生了影响,因为我正在尝试拾取C ++ 11。 据我所知,C ++不允许使用可变长度数组。 但是,许多编译器允许它作为扩展(GCC?)。 问题是,现在我正在尝试学习C ++ 11,我无法判断我编写的是有效的C ++,还是C ++扩展的C99兼容性。 例如: std::default_random_engine e{}; std::uniform_int_distribution d{}; const int x{d(e)}; int arr[x]; // compiles 我不知道这是否是有效的C ++。 显然,直到运行时才知道x的值。 […]

在C中模拟std :: bind

我正在使用std :: bind来提供回调,同时通过首先绑定一些参数来抽象一些逻辑。 即 void start() { int secret_id = 43534; //Bind the secret_id to the callback function object std::function cb = std::bind(&callback, secret_id, std::placeholders::_1); do_action(cb); } void do_action(std::function cb) { std::string result = “hello world”; //Do some things… //Call the callback cb(result); } void callback(int secret_id, std::string result) { //Callback can now do something […]

在OS X 10.9和MATLAB 2012a下使用Xcode 5.1的Mex文件

我正在尝试为OpenCV(3.0.0)编译开发人员构建,但是我无法将我的系统配置为mex C文件。 我试图遵循stackoverflow的建议,目前我可以使用mex c ++文件,但不能使用C ++文件。 我所做的是编辑mexopts.sh以便使用正确的SDKROOT ,我也将部署目标更改为10.9 。 我的mexopts.sh看起来如下: #PATCH: MacOSX10.8 // updated manually to 10.9 CC=’llvm-gcc’ CXX=’llvm-g++’ SDKROOT=’/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/’ #SDKROOT=’/’ MACOSX_DEPLOYMENT_TARGET=’10.9′ ARCHS=’x86_64′ # StorageVersion: 1.0 # CkeyName: GNU C # CkeyManufacturer: GNU # CkeyLanguage: C # CkeyVersion: CFLAGS=”-fno-common -no-cpp-precomp -arch $ARCHS -isysroot $SDKROOT -mmacosx-version-min=$MACOSX_DEPLOYMENT_TARGET” CFLAGS=”$CFLAGS -fexceptions” CLIBS=”$MLIBS” COPTIMFLAGS=’-O2 -DNDEBUG’ CDEBUGFLAGS=’-g’ CLIBS=”$CLIBS -lstdc++” # C++keyName: […]