Questions tagged «c++»

C ++是一种通用编程语言。它最初被设计为C的扩展,并且具有类似的语法,但是现在它是一种完全不同的语言。使用此标记可解决有关将要使用C ++编译器编译的代码的问题。对于与特定标准修订版[C ++ 11],[C ++ 14],[C ++ 17]或[C ++ 20]等相关的问题,请使用特定于版本的标记。

2
简而言之,什么是COM(组件对象模型)?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 7年前关闭。 改善这个问题 看来COM对象是受OS控制的通用对象。对象遵循严格的界面,并允许您查询对象以确定信息。这是COM对象吗?
89 c++  com 

7
指向成员函数的函数指针
我想将一个函数指针设置为一个类的成员,该类是指向同一类中另一个函数的指针。我这样做的原因很复杂。 在此示例中,我希望输出为“ 1” class A { public: int f(); int (*x)(); } int A::f() { return 1; } int main() { A a; a.x = a.f; printf("%d\n",a.x()) } 但这无法编译。为什么?


10
CMake无法使用C ++确定链接器语言
我试图同时在Windows 7 x64和Visual Studio 2010和Cygwin上运行cmake hello world程序,但似乎都无法正常工作。我的目录结构如下: HelloWorld -- CMakeLists.txt -- src/ -- -- CMakeLists.txt -- -- main.cpp -- build/ 我先执行,cd build然后执行cmake ..,并收到一条错误消息,指出 CMake Error: CMake can not determine linker language for target:helloworld CMake Error: Cannot determine link language for target "helloworld". 但是,如果我将filsystem和src/CMakeLists.txt所有正常工作的main.cpp扩展名更改为main.c。从Visual Studio命令提示符(Visual Studio解决方案生成器)和Cygwin终端(Unix Makefiles生成器)运行都是这种情况。 知道为什么这段代码行不通吗? CMakeLists.txt PROJECT(HelloWorld C) …
89 c++  c  cmake 

13
该程序如何工作?
#include <stdio.h> int main() { float a = 1234.5f; printf("%d\n", a); return 0; } 它显示一个0!! 那怎么可能?这是什么原因? 我故意%d在printf声明中加入,以研究的行为printf。
88 c++  c  memory  printf  endianness 

4
最接近1.0的双精度数是不是1.0?
有没有办法以编程方式获取最接近1.0的double,但实际上不是1.0? 一种可行的方法是将双精度数存为相同大小的整数,然后减去一个。IEEE754浮点格式的工作方式是,将小数部分从全零(1.000000000000)更改为全1(1.111111111111),最终将指数减小了一个。但是,有些机器将整数存储在低位在前,而浮点存储在大在前,因此这并不总是可行。


3
* a =&a如何合法?
考虑以下C ++代码: void* a = &a; 为什么编译器不抱怨使用未声明的标识符? 另外,编译器认为变量a是什么?是指向空对象的指针还是指向指针的void*指针?
88 c++ 


3
什么时候私有构造函数不是私有构造函数?
假设我有一个类型,并且想将其默认构造函数设为私有。我写以下内容: class C { C() = default; }; int main() { C c; // error: C::C() is private within this context (g++) // error: calling a private constructor of class 'C' (clang++) // error C2248: 'C::C' cannot access private member declared in class 'C' (MSVC) auto c2 = C(); // …

4
Java使用数组的速度是C ++中std :: vector的8倍。我做错什么了?
我有以下带有几个大数组的Java代码,这些数组永远不会改变其大小。它在我的计算机上运行1100毫秒。 我在C ++中实现了相同的代码并使用了std::vector。 在我的计算机上,运行完全相同的代码的C ++实现的时间为8800 ms。我做错了什么,所以运行缓慢? 基本上,代码执行以下操作: for (int i = 0; i < numberOfCells; ++i) { h[i] = h[i] + 1; floodedCells[i] = !floodedCells[i]; floodedCellsTimeInterval[i] = !floodedCellsTimeInterval[i]; qInflow[i] = qInflow[i] + 1; } 它遍历大小约为20000的不同数组。 您可以在以下链接下找到这两种实现: Java:https://ideone.com/R8KqjT C ++:https://ideone.com/Lu7RpE (由于时间限制,在ideone上,我只能运行400次而不是2000次循环。但是即使在这里,相差三倍)

8
可以将具有未定义行为的分支视为不可达并优化为死代码吗?
考虑以下语句: *((char*)NULL) = 0; //undefined behavior 它显然会调用未定义的行为。给定程序中存在这样的语句是否意味着整个程序是未定义的,或者行为仅在控制流命中该语句后才变为未定义? 如果用户从不输入数字,以下程序是否定义明确3? while (true) { int num = ReadNumberFromConsole(); if (num == 3) *((char*)NULL) = 0; //undefined behavior } 还是无论用户输入什么,都是完全不确定的行为? 另外,编译器可以假定未定义的行为永远不会在运行时执行吗?这将允许往后倒推: int num = ReadNumberFromConsole(); if (num == 3) { PrintToConsole(num); *((char*)NULL) = 0; //undefined behavior } 在这里,编译器可能会推断出万一num == 3我们总是调用未定义的行为。因此,这种情况必须是不可能的,并且不需要打印号码。整个if语句可以优化。根据标准是否允许这种向后推理?

3
有使用Boost.Log日志记录库的经验吗?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我正在考虑开始使用Boost.Log日志记录库。有人在使用Boost.Log吗?请分享您在这方面的经验。 我正在考虑的其他库是Apache log4cxx(安装起来很繁琐,但我的团队成员希望入门简单)和Pantheios(相同的问题,因为它可与额外的前端和后端配合使用)。
88 c++  boost  logging  boost-log 

6
函数返回lambda表达式
我想知道是否有可能在C ++ 11中编写一个返回lambda函数的函数。当然,一个问题是如何声明这种功能。每个lambda都有一个类型,但是该类型在C ++中无法表达。我认为这不起作用: auto retFun() -> decltype ([](int x) -> int) { return [](int x) { return x; } } 也没有: int(int) retFun(); 我不知道从lambda到函数指针等的任何自动转换。唯一的解决方案是手工制作函数对象并返回它吗?
88 c++  function  c++11  lambda 

4
int(*)(int *)= 5(或任何整数值)的含义
我无法弄清楚: int main() { int (*) (int *) = 5; return 0; } 上面的分配使用g ++ c ++ 11进行编译。我知道这int (*) (int *)是一个指向接受(int *)as参数并返回int的函数的指针,但我不明白您如何将其等同于5。起初,我认为这是一个不断返回5的函数(根据我最近的学习F#,可能是哈哈),然后,我简要地想到了,该函数指针指向内存位置5,但这显然不起作用,十六进制值也不起作用。 认为可能是因为该函数返回一个int,并且分配一个int是可以的(以某种方式),所以我也尝试这样做: int * (*) (int *) = my_ptr wheremy_ptr是type int *,与第二个函数指针的类型相同,第一种情况是int类型。这不会编译。分配5或任何int值而不是my_ptr都不会为此函数指针编译。 那任务是什么意思呢? 更新1 我们已确认这是一个错误,如最佳答案所示。但是,仍然不知道分配给函数指针的值实际发生了什么,或者分配发生了什么。任何(良好)的解释将不胜感激!请参考下面的编辑以更清楚地了解该问题。 编辑1 我正在使用gcc版本4.8.2(在Ubuntu 4.8.2中) 编辑2 实际上,将其等同于对我的编译器有效的任何东西。甚至将其等同于std :: string变量,或者返回双精度值的函数名称,都可以使用。 编辑2.1 有趣的是,使其成为指向返回非指针数据类型的任何函数的函数指针,将使其进行编译,例如 std::string (*) () = 5.6; …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.