Tag: c ++ 11

`f(void)`表示C ++ 11或C中没有参数?

在C ++ 11中,以下函数声明: int f(void); 意思是: int f(); 由非依赖类型void的单个未命名参数组成的参数列表等效于空参数列表。 我得到(也许是错误的)印象这是一个旧function,也许是从Cinheritance而来的? 有没有人知道这种方式背后的历史或理由来声明一个没有参数的函数?

联锁function和primefaces性:仍然困惑

我仍然对以primefaces方式读取和写入变量感到困惑。 对于那些在以前的问题中试图提供帮助的人,请提前抱歉。 今天我被告知,在读取和写入一个32位long值时,不需要任何Interlocked函数调用,这会打破我以前的信念 。 实际上,这支持了MSDN所说的内容 对正确对齐的32位变量的简单读取和写入是primefaces操作。 换句话说,您最终只会更新变量的一部分; 所有位都以primefaces方式更新 然后我看看atomic_long中的atomic_long是做什么的; 其operator=使用新值对当前值执行_InterlockedExchange() 。 这不与MSDN相矛盾; 如果读/写是primefaces的,为什么需要这个Interlocked函数? 在同一个MSDN页面上,我们也有 对64位Windows进行简单的读取和写入正确对齐的64位变量是primefaces的。 在32位Windows上,不保证对64位值的读写操作是primefaces的。 对其他大小的变量的读写不保证在任何平台上都是primefaces的。 所以我接着进入atomic_bool的’ operator= ; 它执行_InterlockedExchange8调用, MSDN告诉我该调用仅适用于Windows 8及更高版本。 这似乎支持第二个MSDN报价。 如果我使用VS 2005并针对Windows XP,我如何确保布尔变量的primefaces读/写? 我是否必须使用互斥锁或类似的? 如果读/写操作不是primefaces的,那么它就容易被撕裂; 那是对的吗? 我读过这个PAQ ,说原始类型不是primefaces的。 这再次与我在问题中告诉我的内容以及MSDN告诉我的内容相矛盾。 谁是对的?

C ++包括汇编函数

我试图找到一些方法来解决一些没有太多C ++ 11支持的平台,但是使用x86程序集。 我知道集会,但我没有做太多。 我想做的是编写一个C ++函数,带有头文件和源文件,编译头文件,并使用GCC 4.8来源代码到x86程序集(无依赖关系,甚至不是STL),然后使用汇编文件使用GCC 4.4编译的程序(可能首先使用4.4 [?]将它们编译为静态库)。 是否有可能做到这一点? 我一直在玩它几个小时,但没有取得很多好成绩。 有人对此有任何煽动吗?

修改静态变量是否安全?

从C ++ 11开始,静态变量初始化保证是线程安全的。 但是如何修改多个线程中的静态变量呢? 如下 static int initialized = 0; Initialize() { if (initialized) return; initialized = 1; // Is this thread safe? } 我问这个问题的原因是我正在阅读Py_Initialize()的源代码,我试图将Python嵌入到multithreadingC ++应用程序中,我想知道在多个线程中多次调用Py_Initialize()是否安全? Py_Initialize()的实现归结为函数_Py_InitializeEx_Private ,如下所示 // pylifecycle.c static int initialized = 0; _Py_InitializeEx_Private(int install_sigs, int install_importlib) { if (initialized) return; initialized = 1; // a bunch of other stuff } C的结论与C ++相同吗? […]

有没有办法解决供应商引入的#define?

因此,我们使用的供应商提供了一个库(主要用于C,具有一些C ++支持),它执行以下操作: #ifndef int64_t #define int64_t s_int64 #endif #ifndef int32_t #define int32_t s_int32 #endif #ifndef int16_t #define int16_t s_int16 #endif #ifndef int8_t #define int8_t s_int8 #endif 在他们的图书馆深处的一个标题中。 现在的问题是,一旦他们的库包含在简单的C ++ 11代码中,例如: #include #include int main(void) { std::int32_t std_i = 0; return std_i; } 立即出现编译器错误( s_int32不在std:: )。 所以问题是,除了唠叨供应商这个解决方案之外,还有在我们的代码中解决这个问题吗? (顺便说一句。我尝试的东西, #include 在它们的标题之前 ,没有运气; extern “C”包装,没有运气。标题安装在/usr/include/所以无法控制包含的顺序我猜好…)

如何在独立的C或C ++实现中理解primefaces?

C11和C ++ 11根据执行线程定义primefaces。 而在托管环境中,很清楚线程是什么,在独立语言实现中它是一个模糊的术语。 如何在独立实现中正式理解C11和C ++ 11中指定的primefaces,其中所有线程必须在程序内实现? 例如:ISR是一个单独的执行线程吗? 为什么标准委员会根据线程而不是简单地在代码排序领域定义primefaces? 除了gcc之外,是否有任何嵌入式编译器已经支持C11 / C ++ 11primefaces?

如果您知道在到达有效区域的末尾之前找到该字符,那么调用长度过长的memchr是否合法?

在C11和C ++ 11 1中是否有以下定义的行为? bool has4() { char buf[10] = {0, 1, 2, 4}; return memchr(buf, 4, 20); } 在这里,我们通过一个太长的长度memchr 。 数组有10个元素,但是我们传递了20.但是,我们搜索的元素总是在结束之前找到。 我很清楚这是否合法。 如果允许这样做,则会限制实现的灵活性,因为实现不能依赖于大小是可访问存储器区域大小的有效指示,因此必须小心读取超出找到的元素。 一个例子是希望从传入指针开始执行16字节SIMD加载然后并行检查所有16个字节的实现。 如果用户传递的长度为16,则只有在需要访问整个长度时才会安全。 否则(如果上面的代码是合法的),实现必须避免对目标元素之外的元素进行潜在的error handling,例如通过对齐加载(可能很昂贵)或检查指针是否接近保护边界的末尾 。 1这是一个罕见的问题,我猜C和C ++的标记是有效的:据我所知,C ++标准只是在行为方面直接推迟到C标准,但是如果不是这样的话我想知道。

是C ++或C中可调用的主函数

我可以从其他函数调用C / C ++中的main方法吗? 它似乎工作,但我不知道它是否是一个很好的c ++软件设计。 请告诉我利弊? 谢谢。

此示例是否包含数据竞争?

这是原始问题,但我的问题有些不同。 C ++内存模型 – 此示例是否包含数据竞争? 我的问题: //CODE-1: initially, x == 0 and y == 0 if (x) y++; // pthread 1 if (y) x++; // pthread 2 注意:上面的代码是用C语言编写的,而不是用C ++编写的(没有内存模型)。 那么它是否包含数据竞争? 从我的观点来看:如果我们在顺序一致性内存模型中查看代码,则没有数据竞争,因为x和y将永远不会同时为非零。 但是,我们永远不能假设顺序一致性内存模型,因此编译器重新排序可以进行相对于线程内正确性的转换,因为编译器不知道线程的存在…….对吗? 所以代码可以转换为: //CODE-2 y++; if (!x) y–; x++; if (!y) x–; 上面的转换并没有违反顺序正确性所以它是正确的。这不是编译器的错,对吧? 所以我同意CODE-1包含数据竞争的观点。你呢? 我有一个额外的问题,带有内存模型的C ++ 11可以解决这个数据竞争因为编译器知道线程,所以他们会根据内存模型类型进行重新排序,对吧?

将c ++ lambda传递给旧的c函数指针

我必须为旧的c库创建一个c ++包装器。 在类方法中,我必须调用ac函数,它接受其他东西也是函数指针(它是一个事件处理程序,该函数接受一个事件发生时触发的函数)。 一个简单的例子是: void myclass::add_handler(std::function handler, otherstuff…) { /* * Many things. */ type_of_function_pointer_accepted_by_old_c_library_add_handler nameofvariable = [handler](same_arguments_as_in_definition_of_the_old_c_function_pointer_accepted) { /* * Many other things with other stuff to be done before the * handler but always only when fired and not when myclass::add_handler is called. */ handler(); }; old_c_library_add_handler(nameofvariable); /* * Last things. */ } […]