Tag: c ++ 11

C的“自动”关键字的目标

C中“auto”关键字的目标是什么? 使用C ++ 0x它有了新的含义,但它是否意味着如果我将C代码移植到C ++ 0x编译器,我的代码将会中断?

在C ++ 11后的现代C ++中使用原始指针

鉴于C ++ 11标准现在得到了大多数体面编译器的良好支持,2014年使用原始指针的主要原因有哪些? 我确定了几个场景: 您正在扩展大量使用原始指针的遗留代码库,并且您希望保持样式的一致性。 您正在使用仅导出原始指针的库,但我猜您仍然可以使用强制转换。 您希望利用指针的function来提供多个级别的间接。 (我不太清楚C ++ 11是否足以知道是否可以使用智能指针或使用其他技术来实现。) 您认为哪些其他场景适合使用指针? 今天你甚至会建议学习一般的指针吗?

CMake生成器表达式,区分C / C ++代码

我想将-std=c++11添加到我的 add_compile_options(“-std=c++11”) 但是,这也将它们添加到C文件的编译中,而不仅仅是C ++ 。 我知道我可以根据使用的配置添加条件编译标志: add_compile_options(“$<$:-addMeInDebugOnly>”) 如何将我的标志仅添加到c ++文件中? 我正在寻找类似的东西: add_compile_options(“$<$:-std=c++11>”) 但是我需要填写问号呢?

为什么C ++ 11不支持在静态成员函数上声明extern“C”?

前提是我有一个包含声明为void g(void (*callback)());的函数的C库void g(void (*callback)()); 以下代码优雅但非法: struct A { // error C2159: more than one storage class specified (VC++ Nov 2012 CTP) static extern “C” void callback() {} }; g(A::callback); 为什么C ++ 11不支持这个?

C NULL是否等于C ++ 11 nullptr

我喜欢使用nullptr而不是NULL。 现在我调用一个C函数(在本例中来自libjansson )。 C中的NULL是实现定义的 。 对于nullptr我发现“空指针常量是整数类型的整数常量表达式(5.19)rvalue,其值为零”。 所以最安全的事情是: auto string_obj=json_object_get(m_handle,name); if(string_obj!=NULL) { auto string=json_string_value(string_obj); if(string!=NULL) {return string;} } return nullptr; 我真的需要它还是可以更简单地做到: auto string_obj=json_object_get(m_handle,name); if(string_obj!=nullptr) { return json_string_value(string_obj); //Assume there is no difference between C NULL and C++11 nullptr } return nullptr;

std :: signal和std :: raise线程安全吗?

C和C ++标准支持信号的概念。 但是,C11标准表示无法在multithreading环境中调用函数signal(),或者行为未定义。 但我认为信号机制本质上适用于multithreading环境。 引用C11标准7.14.1.1.7 “在multithreading程序中使用此函数会导致未定义的行为。实现的行为就像没有库函数调用信号函数一样。” 对此有何解释? 以下代码不言而喻。 #include #include using namespace std; void SignalHandler(int) { // Which thread context here? } void f() { // // Running in another thread context. // raise(SIGINT); // Is this call safe? } int main() { // // Register the signal handler in main thread context. // signal(SIGINT, […]

C中的volatile int和C ++ 0x的std :: atomic 一样好吗?

我需要在我的程序中有primefaces变量。 以前我使用的是std::atomic ,但我现在正在使用的平台没有支持C ++ 0x的g ++编译器。 我使用了volatile int ,它似乎正在工作,因为我还没有在多核系统中遇到竞争条件,我正在测试它。 我的问题是volatile int是primefaces的,比如std::atomic吗? 此外,它是否会产生内存障碍(我也需要)?

如何将C ++ lambda传递给需要函数指针和上下文的C-callback?

我正在尝试在使用标准函数指针+上下文范例的C-API中注册回调。 这是api的样子: void register_callback(void(*callback)(void *), void * context); 我真正想做的是能够注册一个C ++ lambda作为回调。 另外,我希望lambda是一个捕获变量的(即无法转换为直接无状态std::function ) 我需要写什么样的适配器代码才能将lambda注册为回调?

C ++ 0x是否支持__stdcall或extern“C”capture-nothing lambdas?

昨天我在考虑是否可以使用C ++ 0x lambda函数的便利来编写Windows API函数的回调。 例如,如果我想将一个lambda用作EnumChildProc的EnumChildWindows怎么办? 就像是: EnumChildWindows(hTrayWnd, CALLBACK [](HWND hWnd, LPARAM lParam) { // … return static_cast(TRUE); // continue enumerating }, reinterpret_cast(&myData)); 另一个用途是为C例程编写extern “C”回调。 例如: my_class *pRes = static_cast(bsearch(&key, myClassObjectsArr, myClassObjectsArr_size, sizeof(my_class), extern “C” [](const void *pV1, const void *pV2) { const my_class& o1 = *static_cast(pV1); const my_class& o2 = *static_cast(pV2); int res; // […]

如何在编译时提取没有路径和后缀的源文件名?

同时使用带有-std = c11的gcc和带有-std = c ++ 14的g ++。 例如,对于名为src/dir/Hello.cxx的文件,它应该扩展为例如: const char basename[] = “Hello”; 要么 const char basename[] = getStaticBasename(__FILE__); 其中getStaticBasename()是一个宏(对于C源)或constexpr函数(对于C ++源),其结果为“Hello”。 我必须避免在运行时从__FILE__中拆分字符串,因为路径和后缀不能以任何方式编译到可执行文件中。 解决方案必须不依赖于诸如boost之类的大型库。 因为我没有makefile,所以在我的情况下不能使用这样的解决方案。 有人有解决方案吗? 编辑2015-07-02: 我对如何调用编译器和链接器没有影响(有时通过makefile,有时来自命令行,或某些IDE(Eclipse CDT托管make,Crossworks,Xcode等等)。所以解决方案只需要代码。 我的用例是为小型日志记录解决方案提供某种“通用区域标识符”。 应用程序代码(使用我的记录器)应仅#include 并且在稍后调用例如LOG_DEBUG(…)我将隐含地使用自动生成的“通用区域标识符”。 我目前的解决方案是应用程序代码必须声明一个JOE_LOG_FILE_REGION(Hello); (在#include ),它可以在其代码中放置LOG_DEBUG(…) 。