Questions tagged «c++»

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

6
如何从命令行编译Visual Studio项目?
我正在为使用Monotone,CMake,Visual Studio Express 2008和自定义测试的大型C ++解决方案编写结帐,构建,分发,测试和提交周期的脚本。 所有其他部分似乎都非常简单明了,但是我不明白如何在没有GUI的情况下编译Visual Studio解决方案。 该脚本是用Python编写的,但是给出的答案允许我仅调用os.system。


19
#ifdef vs #if-作为启用/禁用特定代码段编译的方法,哪种方法更好/更安全?
这可能是风格问题,但我们的开发团队存在一些分歧,我想知道是否还有其他人对此有任何想法... 基本上,我们有一些调试打印语句,这些语句在正常开发过程中会关闭。我个人更喜欢执行以下操作: //---- SomeSourceFile.cpp ---- #define DEBUG_ENABLED (0) ... SomeFunction() { int someVariable = 5; #if(DEBUG_ENABLED) printf("Debugging: someVariable == %d", someVariable); #endif } 但是,有些团队更喜欢以下内容: // #define DEBUG_ENABLED ... SomeFunction() { int someVariable = 5; #ifdef DEBUG_ENABLED printf("Debugging: someVariable == %d", someVariable); #endif } ...哪种方法对您听起来更好,为什么呢?我的感觉是第一个比较安全,因为总会定义一些东西,并且没有危险可以破坏其他地方的其他定义。

8
如何简洁,可移植和彻底播种mt19937 PRNG?
我似乎看到了许多答案,有人建议使用这些答案<random>来生成随机数,通常连同这样的代码一起使用: std::random_device rd; std::mt19937 gen(rd()); std::uniform_int_distribution<> dis(0, 5); dis(gen); 通常,这会代替某种“邪恶可憎”,例如: srand(time(NULL)); rand()%6; 我们可以批评的理由是旧的方式time(NULL)提供了低熵,time(NULL)是可以预测的,而最终的结果是不均匀的。 但是,所有这一切对于新方法都是正确的:它只是饰面更亮。 rd()返回一个unsigned int。它至少有16位,可能是32位。这不足以使MT的19937位状态成为种子。 使用std::mt19937 gen(rd());gen()(用32位播种并查看第一个输出)不能提供良好的输出分布。7和13永远不会是第一个输出。两颗种子产生0。十二颗种子产生1226181350。(链接) std::random_device可以并且有时被实现为带有固定种子的简单PRNG。因此,每次运行可能会产生相同的序列。(链接)甚至比time(NULL)。 更糟糕的是,尽管存在上述问题,但复制并粘贴上述代码片段非常容易。为此,一些解决方案需要获取可能并不适合每个人的大型 库。 有鉴于此,我的问题是,如何能以C ++简洁,可移植,彻底地植入mt19937 PRNG? 鉴于上述问题,一个好的答案是: 必须完全植入mt19937 / mt19937_64。 不能完全依赖std::random_device或time(NULL)作为熵的来源。 不应该依赖Boost或其他库。 应该放在少量的行中,这样看起来很不错,可以粘贴到答案中。 思想 我目前的想法是,std::random_device可以使用time(NULL),从地址空间随机化派生的值和硬编码的常数(可以在分发期间设置)将的输出(可以通过XOR)进行混搭,以尽力而为。 std::random_device::entropy() 不能很好地说明std::random_device可能做什么或可能不会做什么。
112 c++  c++11  random 

4
枚举类可以转换为基础类型吗?
有没有一种方法可以将enum class字段转换为基础类型?我认为这将是自动的,但显然不是。 enum class my_fields : unsigned { field = 1 }; unsigned a = my_fields::field; 该作业已被GCC拒绝。error: cannot convert 'my_fields' to 'unsigned int' in assignment。
112 c++  c++11 



10
将标题分为8个方向时,如何避免if / else if连锁?
我有以下代码: if (this->_car.getAbsoluteAngle() <= 30 || this->_car.getAbsoluteAngle() >= 330) this->_car.edir = Car::EDirection::RIGHT; else if (this->_car.getAbsoluteAngle() > 30 && this->_car.getAbsoluteAngle() <= 60) this->_car.edir = Car::EDirection::UP_RIGHT; else if (this->_car.getAbsoluteAngle() > 60 && this->_car.getAbsoluteAngle() <= 120) this->_car.edir = Car::EDirection::UP; else if (this->_car.getAbsoluteAngle() > 120 && this->_car.getAbsoluteAngle() <= 150) this->_car.edir = Car::EDirection::UP_LEFT; else if …
111 c++  if-statement 


13
如何使用C ++避免内部带有“ if”条件的“ for”循环?
用我编写的几乎所有代码,我经常要处理集合的集合约简问题,这些集合最终会在集合内部出现幼稚的“ if”条件。这是一个简单的例子: for(int i=0; i<myCollection.size(); i++) { if (myCollection[i] == SOMETHING) { DoStuff(); } } 使用函数式语言,我可以通过轻松地将集合简化为另一个集合来解决问题,然后对我的简化集合执行所有操作。用伪代码: newCollection <- myCollection where <x=true map DoStuff newCollection 在其他C变体中,例如C#,我可以使用where子句来简化 foreach (var x in myCollection.Where(c=> c == SOMETHING)) { DoStuff(); } 或者更好(至少在我看来) myCollection.Where(c=>c == Something).ToList().ForEach(d=> DoStuff(d)); 诚然,我正在做很多范式混合和基于主观/观点的风格,但是我不禁感到缺少真正的基础知识,可以让我将这种首选技术与C ++一起使用。有人可以启发我吗?
111 c++  c++11  c++14 

9
从C ++成员函数调用Objective-C方法?
我有一个类(EAGLView),它可以C++毫无问题地调用类的成员函数。现在,问题是我需要在C++该类中调用objective-C function [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer];我在C++语法上无法做到的。 我可以将此Objective-C调用包装到Objective-C最初称为C ++类的同一类中,但是随后我需要以某种方式从中调用该方法C++,而我不知道该怎么做。 我试图提供一个指向EAGLViewC ++成员函数的对象的指针,并EAGLView.h在C++类标题中包含“ ”,但出现3999错误。 所以..我应该怎么做?有一个很好的例子。我只发现C这样做的纯粹例子。
111 c++  objective-c 

16
C ++:空类的对象的大小是多少?
我想知道一个空类的对象的大小是多少。它肯定不能为0字节,因为它应该可以像其他任何对象一样进行引用和指向。但是,这样的物体有多大? 我用了这个小程序: #include <iostream> using namespace std; class Empty {}; int main() { Empty e; cerr << sizeof(e) << endl; return 0; } 我在Visual C ++和Cygwin-g ++编译器上得到的输出都是1个字节!这让我有些惊讶,因为我期望它的大小与机器字一样(32位或4字节)。 谁能解释为什么 1个字节的大小?为什么不是 4个字节?这也取决于编译器或计算机吗?另外,有人可以给出更确切的理由说明为什么空的类对象的大小不为0字节吗?
111 c++  class  object 

7
在C ++中执行语句顺序
假设我有许多要按固定顺序执行的语句。我想在优化级别2中使用g ++,因此某些语句可以重新排序。一个人必须使用哪些工具来强制执行某种语句排序? 考虑以下示例。 using Clock = std::chrono::high_resolution_clock; auto t1 = Clock::now(); // Statement 1 foo(); // Statement 2 auto t2 = Clock::now(); // Statement 3 auto elapsedTime = t2 - t1; 在此示例中,以给定顺序执行语句1-3非常重要。但是,编译器是否不能认为语句2独立于1和3并按以下方式执行代码? using Clock=std::chrono::high_resolution_clock; foo(); // Statement 2 auto t1 = Clock::now(); // Statement 1 auto t2 = Clock::now(); // …

3
数组与向量:介绍性的相似之处和不同之处
从目前的情况来看,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 C ++中的数组和向量之间有什么区别?差异的一个例子可能包括库,符号,能力等。 数组 数组包含特定数量的特定类型的元素。为了使编译器可以在编译程序时保留所需的空间量,必须指定定义数组时数组将包含的元素类型和数量。编译程序时,编译器必须能够确定该值。定义数组后,可以将数组的标识符与索引一起使用,以访问数组的特定元素。数组是零索引的;也就是说,第一个元素在索引0处。此索引方案指示C ++中指针与数组之间的紧密关系以及该语言为指针算术定义的规则。 — C ++ Pocket参考 向量 向量是动态大小的对象序列,提供了数组样式的operator[]随机访问。成员函数push_back通过copy构造函数复制其参数,将该副本添加为向量中的最后一项,并将其大小增加1。pop_back通过删除最后一个元素实现完全相反的操作。从向量末尾插入或删除项目需要摊销固定时间,而从任何其他位置插入或删除项目则需要线性时间。这些是向量的基础。他们还有很多。在大多数情况下,向量应是C样式数组的首选。首先,它们是动态调整大小的,这意味着它们可以根据需要增长。您不必为了C数组的情况而进行各种研究来找出最佳的静态大小。向量会根据需要增长,并且可以根据需要手动调整其大小。其次,向量使用at成员函数提供边界检查(但不能使用operator[]),这样您就可以在引用不存在的索引时做些事情,而不是仅仅看着程序崩溃或更糟,而是继续执行损坏的数据。 — C ++食谱
111 c++  arrays  vector 

7
是否保证std :: vector元素是连续的?
我的问题很简单:std :: vector元素是否保证是连续的?顺便说一句,我可以使用指向std :: vector第一个元素的指针作为C数组吗? 如果我的记忆很好,那么C ++标准将无法保证。但是,由于std :: vector要求如此,如果元素不连续,则几乎不可能满足它们。 有人可以澄清吗? 例: std::vector<int> values; // ... fill up values if( !values.empty() ) { int *array = &values[0]; for( int i = 0; i < values.size(); ++i ) { int v = array[i]; // do something with 'v' } }
111 c++  vector  standards 

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.