Questions tagged «c++»

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



9
C ++标头中的“使用命名空间”
在我们所有的C ++课程,所有的老师总是把using namespace std;在之后#include在它们的S .h文件。在我看来,这很危险,因为通过将标头包含在另一个程序中,我可能会将名称空间导入到我的程序中,而可能没有意识到,有意或不想要它(标头包含可以非常嵌套)。 所以我的问题是双重的:我是对的,using namespace不应该在头文件中使用它,并且/或者有某种方法可以撤消它,例如: //header.h using namespace std { . . . } 同样,还有一个问题:标头文件应该是#include其对应.cpp文件所需的所有标头,还是标头定义所需的所有标头,然后让.cpp文件#include剩下的标头,或者什么都不需要,并将其需要的所有内容声明为extern? 问题背后的原因与上面的相同:包含.h文件时,我不希望感到惊讶。 另外,如果我是对的,这是常见错误吗?我的意思是在现实世界中编程和在那里的“真实”项目中。 谢谢。


19
如何轻松地将C ++枚举映射到字符串
我在使用的某些库头文件中有一堆枚举类型,并且我希望有一种将枚举值转换为用户字符串的方法,反之亦然。 RTTI不会为我这样做,因为“用户字符串”必须比枚举更具可读性。 暴力解决方案将是一堆类似这样的功能,但我觉得这有点像C。 enum MyEnum {VAL1, VAL2,VAL3}; String getStringFromEnum(MyEnum e) { switch e { case VAL1: return "Value 1"; case VAL2: return "Value 2"; case VAL1: return "Value 3"; default: throw Exception("Bad MyEnum"); } } 我有一种直觉,认为使用模板是一种优雅的解决方案,但是我还不能完全理解。 更新:感谢您的建议-我应该明确指出枚举是在第三方库标头中定义的,因此我不想更改它们的定义。 我现在的直觉是避免模板并执行以下操作: char * MyGetValue(int v, char *tmp); // implementation is trivial #define ENUM_MAP(type, …
119 c++  templates  enums 

1
模板类中的模板函数
我有以下代码: template <class T> class MyClass { public: template <class U> void foo() { U a; a.invoke(); } }; 我想要这种形式: template <class T> class MyClass { public: template <class U> void foo(); }; template <class T> /* ????? */ void MyClass<T>::foo() { U a; a.invoke(); } 我该怎么做?正确的语法是什么?
119 c++  templates 

7
如何使用gcc / g ++在Linux上为Windows编译?
我已经在Linux上使用freeglut在C ++(g ++)中编写了一些效果,并使用 g++ -Wall -lglut part8.cpp -o part8 所以我想知道是否可以让g ++制作包含所需一切的静态Windows可执行文件? 我没有Windows,所以如果我可以在Linux上这样做,那真的很酷:)
119 c++  opengl  gcc  glut  freeglut 

1
CMAKE中添加-fPIC编译器选项的惯用方式是什么?
我至少遇到了3种方法来做,我想知道哪种是惯用的方法。几乎所有静态库都需要这样做。我很惊讶CMake中的Makefile生成器没有自动将其添加到静态库中。(除非我想念什么?) target_compile_options(myLib PRIVATE -fPIC) add_compile_options(-fPIC) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fpic") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic") 我相信可能还会有其他变化。(如果找到一个,请编辑我的问题) 如果您碰巧知道此问题的答案,您是否还知道是否有一种方法可以使第三方CMake项目使用此标志进行编译,而无需修改其CMakeLists.txt文件?我遇到了缺少该标志的静态库。在将静态库编译为动态库时会引起问题。 你得到: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
119 c++  c  cmake 

30
如何改进检查4个布尔值是否与某些情况匹配的逻辑
我有四个bool值: bool bValue1; bool bValue2; bool bValue3; bool bValue4; 可接受的值为: Scenario 1 | Scenario 2 | Scenario 3 bValue1: true | true | true bValue2: true | true | false bValue3: true | true | false bValue4: true | false | false 因此,例如,这种情况是不可接受的: bValue1: false bValue2: true bValue3: true bValue4: …
118 c++  if-statement 


6
检测stdin是终端还是管道?
当我python从终端不带任何参数执行“ ”时,它将弹出Python交互式shell。 当我cat | python从终端执行“ ”时,它不会启动交互模式。不知何故,它没有得到任何输入,就检测到它已连接到管道。 如何在C或C ++或Qt中进行类似的检测?
118 c++  c  qt  pipe  stdin 

9
内存泄漏能走多远?
我已经多次遇到内存泄漏。通常,当我- malloc希望没有明天,或者FILE *像脏衣服一样晃来晃去时。我通常认为(拼命:希望)至少在程序终止时才清理所有内存。在程序终止或崩溃时,是否存在无法收集泄漏内存的情况? 如果答案因语言而异,那么让我们关注C(++)。 请注意,短语“好像没有明天”和“晃来晃去……就像脏衣服”一样是双曲线的用法。不安全* malloc可能伤害您所爱的人。另外,请注意不要弄脏衣物。
118 c++  c  memory  memory-leaks 

9
我如何从一个8位整数中得到一个大于8位的值?
我找到了隐藏在这个小宝石后面的极其讨厌的错误。我知道,按照C ++规范,带符号的溢出是未定义的行为,但是只有当值扩展到bit-width时才发生溢出sizeof(int)。据我了解,增加a char永远不会是未定义的行为sizeof(char) < sizeof(int)。但这并不能解释如何c获得不可能的价值。作为8位整数,如何c保存大于其位宽的值? 码 // Compiled with gcc-4.7.2 #include <cstdio> #include <stdint.h> #include <climits> int main() { int8_t c = 0; printf("SCHAR_MIN: %i\n", SCHAR_MIN); printf("SCHAR_MAX: %i\n", SCHAR_MAX); for (int32_t i = 0; i <= 300; i++) printf("c: %i\n", c--); printf("c: %i\n", c); return 0; } 输出量 SCHAR_MIN: -128 …

5
is_base_of是如何工作的?
以下代码如何工作? typedef char (&yes)[1]; typedef char (&no)[2]; template <typename B, typename D> struct Host { operator B*() const; operator D*(); }; template <typename B, typename D> struct is_base_of { template <typename T> static yes check(D*, T); static no check(B*, int); static const bool value = sizeof(check(Host<B,D>(), int())) == sizeof(yes); }; …

8
是否有编译器提示GCC强制分支预测始终遵循某种方式?
对于Intel体系结构,是否有一种方法可以指示GCC编译器生成代码,该代码始终在我的代码中以特定方式强制执行分支预测?英特尔硬件是否还支持此功能?那其他编译器或硬件呢? 我会在C ++代码中使用此代码,因为我知道我希望快速运行的情况,并且即使在最近采用了另一个分支的情况下,也不必关心速度的降低。 for (;;) { if (normal) { // How to tell compiler to always branch predict true value? doSomethingNormal(); } else { exceptionalCase(); } } 作为对Evdzhan Mustafa的后续问题,提示是否可以仅在处理器第一次遇到指令时指定提示,所有后续分支预测均正常运行?

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.