Questions tagged «c++»

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


15
在C ++中确定32位和64位
我正在寻找一种可靠地确定C ++代码是否以32位和64位编译的方法。我们已经提出了我们认为使用宏的合理解决方案,但是很想知道人们是否可以想到这种情况可能会失败,或者是否有更好的方法来做到这一点。请注意,我们正在尝试在跨平台的多编译器环境中执行此操作。 #if ((ULONG_MAX) == (UINT_MAX)) # define IS32BIT #else # define IS64BIT #endif #ifdef IS64BIT DoMy64BitOperation() #else DoMy32BitOperation() #endif 谢谢。


12
哪些平台具有8位字符以外的功能?
char有时,SO上的某人指出(aka'byte')不一定是8位。 看来8位char几乎是通用的。我以为对于主流平台,必须有一个8位char以确保其在市场上的生存能力。 从现在和历史上看,什么平台使用的char不是8位,为什么它们与“普通” 8位不同? 在编写代码并考虑跨平台支持时(例如,针对通用库),对于非8位平台值得考虑什么char? 过去,我遇到过一些char16位的Analog Devices DSP 。我想DSP是一种利基架构。(然后,在那时,手工编码的汇编器很容易击败了可用的C编译器可以做的事情,因此我在该平台上对C的使用并没有太多的经验。)
136 c++  c  cross-platform 

8
C ++构建系统-使用什么?[关闭]
关闭。此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗?更新问题,使其成为Stack Overflow 的主题。 4年前关闭。 改善这个问题 我正在寻找一个用C ++开始的新项目-最初只是在我自己的时间里-我正在研究可用的构建系统。答案似乎是“很多,他们都很糟糕”。 我为此特别需要的功能是: C ++ 11支持 跨平台(Linux是主要目标,但也能够至少在Windows上构建) 体面的单元测试支持 支持多个用于分离代码的模块 支持代码生成(使用asn1c或protobuf-尚不确定100%) 易于维护 现在,我知道我可以轻松完成1-4个使用CMake和Autotools的任务。也许还有SCons和Waf以及其他几个人。问题是我从来没有想过如何使用它们正确地执行代码生成-那是在首次运行构建过程之前不存在的源文件,因此构建系统必须能够将其转换为可执行代码但实际上直到构建开始才知道...(特别是ASN1C生成了数十个必须能够协同工作的头文件和源文件,而实际生成的文件集取决于您的asn文件的内容)还有一个事实是,这些都不是特别容易维护的事实-CMake和Autotools有自己的庞大脚本集,您需要对其进行管理才能使其正常工作, 那么-推荐什么样的构建系统来进行类似的事情?还是我现在会被make文件和shell脚本卡住?
136 c++  build 

9
一次性写“ if”的最优雅方式
由于C ++ 17可以编写一个if块,该块将被完全执行一次,如下所示: #include <iostream> int main() { for (unsigned i = 0; i < 10; ++i) { if (static bool do_once = true; do_once) { // Enter only once std::cout << "hello one-shot" << std::endl; // Possibly much more code do_once = false; } } } 我知道我可能对此有过多的思考,还有其他方法可以解决此问题,但是仍然-是否可以这样写,所以do_once = false最后不需要了吗? …
136 c++  if-statement  c++17 

9
为什么不能对C函数进行名称修改?
我最近接受了一次采访,一个问题被问到extern "C"C ++代码中的用途是什么。我回答说它是在C ++代码中使用C函数,因为C不使用名称修饰。我被问到为什么C不使用名称修饰,老实说我无法回答。 我知道C ++编译器在编译函数时会给函数起一个特殊的名称,主要是因为我们可以在C ++中使用同名的重载函数,这些重载函数必须在编译时进行解析。在C语言中,函数的名称将保持不变,或者在其前面加上_。 我的查询是:允许C ++编译器也处理C函数怎么了?我本来以为编译器给它们起什么名字都没关系。我们在C和C ++中以相同的方式调用函数。
136 c++  c  name-mangling  extern-c 

16
delete []如何知道它是一个数组?
好吧,我想我们都同意,根据所传递的内容,未定义以下代码所发生的情况, void deleteForMe(int* pointer) { delete[] pointer; } 指针可能是各种不同的事物,因此delete[]对它执行无条件的操作是不确定的。但是,假设我们确实在传递数组指针, int main() { int* arr = new int[5]; deleteForMe(arr); return 0; } 我的问题是,在这种情况下,指针是一个数组,谁知道呢?我的意思是,从语言/编译器的角度来看,它不知道arr数组指针还是指向单个int的指针。哎呀,它甚至不知道是否arr是动态创建的。但是,如果我改为执行以下操作, int main() { int* num = new int(1); deleteForMe(num); return 0; } 操作系统足够聪明,只能删除一个int,而不会通过删除超出该点的其余内存来进行某种“杀戮狂潮”(与strlen和非\0终止字符串进行对比),它将一直持续到点击0)。 那么记住这些事情是谁的工作呢?操作系统是否在后台保留某种类型的记录?(我的意思是,我意识到我在开始这篇文章时首先说的是发生的事情是不确定的,但事实是,“杀人狂潮”的情况没有发生,因此在实际世界中有人会记住。)

6
在c ++中,函数名称前的波浪号“〜”表示什么?
template <class T> class Stack { public: Stack(int = 10) ; ~Stack() { delete [] stackPtr ; } //<--- What does the "~" signify? int push(const T&); int pop(T&) ; int isEmpty()const { return top == -1 ; } int isFull() const { return top == size - 1 ; …
136 c++ 

8
在GCC / G ++编译器中使用-pedantic的目的是什么?
此说明说: -ansi:告诉编译器实现ANSI语言选项。这将关闭GCC的某些“功能”,这些功能与ANSI标准不兼容。 -pedantic:与结合使用-ansi,可以告诉编译器严格遵守ANSI标准,拒绝任何不符合要求的代码。 首先要注意的是: GCC / G ++编译器的-pedantic和-ansi选项的目的是什么(我听不懂上面的描述)? 谁能告诉我使用这两个选项的正确情况? 我什么时候应该使用它们? 他们重要吗?
136 c++  c  gcc  g++ 

6
类型擦除技术
(使用类型擦除,我的意思是隐藏有关某个类的某些或所有类型信息,有点像Boost.Any。) 我想掌握类型擦除技术,同时还要分享我所知道的那些技术。我的希望是找到一些在他/她最黑暗的时刻想到的疯狂技术。:) 我知道,第一个也是最常见的方法是虚函数。只需在基于接口的类层次结构中隐藏类的实现即可。许多Boost库都执行此操作,例如Boost.Any执行此操作以隐藏您的类型,Boost.Shared_ptr执行此操作以隐藏(取消)分配机制。 然后是带有指向模板化函数的函数指针的选项,同时将实际对象保留在void*指针中,例如Boost.Function确实隐藏了仿函数的真实类型。在问题的末尾可以找到示例实现。 那么,对于我的实际问题: 您还知道其他什么类型的擦除技术?请为他们提供示例代码,用例,您的使用经验以及可能的链接,以供进一步阅读。 编辑 (因为我不确定是否可以将其添加为答案,或者只是编辑问题,所以我会做得更安全。) 另一种很好的技巧是在没有虚函数或void*摆弄的情况下隐藏事物的实际类型。一个GMan在这里雇用了一个人,这与我对它到底是如何工作的问题有关。 示例代码: #include <iostream> #include <string> // NOTE: The class name indicates the underlying type erasure technique // this behaves like the Boost.Any type w.r.t. implementation details class Any_Virtual{ struct holder_base{ virtual ~holder_base(){} virtual holder_base* clone() const = 0; }; template<class T> …
136 c++  type-erasure 

5
C ++ 11中的新语法“ = default”
我不明白为什么要这么做: struct S { int a; S(int aa) : a(aa) {} S() = default; }; 为什么不说: S() {} // instead of S() = default; 为什么要为此引入新的语法?
136 c++  c++11 

24
为什么变量名不能以数字开头?
当我问一个问题:“为什么变量名不能以数字开头?”时,我正与一个新的C ++开发人员一起工作。 除了一些数字可以包含文本(123456L,123456U)外,我无法给出答案,并且如果编译器认为带有一定数量的字母字符的所有内容都是变量名,那将是不可能的。 那是正确的答案吗?还有其他原因吗? string 2BeOrNot2Be = "that is the question"; // Why won't this compile?

30
如何使用C ++确定字符串是否为数字?
尝试编写一个检查字符串是否为数字的函数时,我遇到了很多麻烦。对于我正在编写的游戏,我只需要检查正在读取的文件中的一行是否是数字(我会以这种方式知道它是否是参数)。我写了下面的函数,我认为它运行正常(或者我不小心对其进行了编辑以使其停止工作,或者我是精神分裂症患者,或者Windows是精神分裂症患者): bool isParam (string line) { if (isdigit(atoi(line.c_str()))) return true; return false; }
136 c++  visual-c++ 

19
/usr/lib/libstdc++.so.6:找不到版本“ GLIBCXX_3.4.15”
如何在Ubuntu中获得GLIBCXX_3.4.15?我无法运行正在编译的某些程序。 当我做: strings /usr/lib/libstdc++.so.6 | grep GLIBC 我得到: GLIBCXX_3.4 GLIBCXX_3.4.1 GLIBCXX_3.4.2 GLIBCXX_3.4.3 GLIBCXX_3.4.4 GLIBCXX_3.4.5 GLIBCXX_3.4.6 GLIBCXX_3.4.7 GLIBCXX_3.4.8 GLIBCXX_3.4.9 GLIBCXX_3.4.10 GLIBCXX_3.4.11 GLIBCXX_3.4.12 GLIBCXX_3.4.13 GLIBCXX_3.4.14 GLIBC_2.2.5 GLIBC_2.3 GLIBC_2.4 GLIBC_2.3.4 GLIBC_2.3.2 GLIBCXX_FORCE_NEW GLIBCXX_DEBUG_MESSAGE_LENGTH 谢谢你的帮助!
135 c++  gcc  libstdc++ 

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.