Questions tagged «c++»

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

9
如何在某些平台上可移植地调用一个采用char **且在其他平台上采用const char **的C ++函数?
在我的Linux(和OS X)计算机上,该iconv()函数具有以下原型: size_t iconv (iconv_t, char **inbuf... 在FreeBSD上,它看起来像这样: size_t iconv (iconv_t, const char **inbuf... 我希望我的C ++代码可以在两个平台上构建。对于C编译器,传递char**for const char**参数(反之亦然)通常仅发出警告;反之亦然。但是在C ++中,这是一个致命错误。因此,如果传递a char**,它将无法在BSD上进行编译,如果传递a const char**,则将无法在Linux / OS X上进行编译。如何在不借助检测平台的情况下编写可在两者上进行编译的代码? 我的一个(失败)想法是提供一个本地原型,该原型将覆盖标头提供的任何原型: void myfunc(void) { size_t iconv (iconv_t, char **inbuf); iconv(foo, ptr); } 这失败,因为iconv需要C链接,并且您不能放入extern "C"函数中(为什么不这样?) 我想出的最佳工作思路是强制转换函数指针本身: typedef void (*func_t)(iconv_t, const char **); ((func_t)(iconv))(foo, ptr); 但这有可能掩盖其他更严重的错误。
91 c++  const  portability 

12
头文件中的变量声明-静态还是非静态?
重构时,#defines我在C ++头文件中遇到了类似于以下内容的声明: static const unsigned int VAL = 42; const unsigned int ANOTHER_VAL = 37; 问题是,静电会产生什么区别(如果有)?请注意,由于经典#ifndef HEADER #define HEADER #endif技巧(如果很重要),不可能多次包含标头。 VAL如果标头被多个源文件包含,则静态值是否仅创建一个副本?
91 c++  c  static 


10
在C ++中递增-何时使用x ++或++ x?
我目前正在学习C ++,不久前我已经了解了增量。我知道您可以使用“ ++ x”在之前进行增量,然后使用“ x ++”在之后进行增量。 不过,我真的不知道什么时候使用这两种方法中的任何一种...我从来没有真正使用过“ ++ x”,并且到目前为止一切正常,因此,我什么时候应该使用它? 示例:在for循环中,何时最好使用“ ++ x”? 另外,有人可以确切解释不同的增量(或减量)如何工作吗?我真的很感激。

5
在C / C ++中声明指针变量的正确方法
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 9年前关闭。 我注意到有人使用以下表示法声明指针变量。 (a) char* p; 代替 (b) char *p; 我用(b)。符号(a)背后的合理性是什么?符号(b)对我来说更有意义,因为字符指针本身不是类型。而是类型是字符,变量可以是指向字符的指针。 char* c; 看起来好像有一个char *类型,而变量c是该类型。但实际上类型是char,而* c(由c指向的内存位置)就是该类型(char)。如果一次声明多个变量,这种区别就很明显。 char* c, *d; 这看起来很奇怪。c和d都是指向字符的指针。在这种情况下,下一个看起来更自然。 char *c, *d; 谢谢。
91 c++  c  pointers  coding-style 

10
用于C / C ++应用程序的开源PDF库?[关闭]
关闭。此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗?更新问题,使其成为Stack Overflow 的主题。 6年前关闭。 改善这个问题 我希望能够从我的(本机)C ++ Windows应用程序生成PDF输出。是否有任何免费/开源库可以做到这一点? 我看着这个问题的答案,但它们大多与.Net有关。
91 c++  c  pdf  open-source 

2
为什么默认情况下std :: stack使用std :: deque?
由于要在堆栈中使用容器的唯一操作是: 背部() 推回() pop_back() 为什么默认容器是双端队列而不是向量? 难道双端队列重分配不会在front()之前提供元素的缓冲区,以便push_front()是有效的操作?这些元素不会浪费,因为它们永远不会在堆栈的上下文中使用吗? 如果没有用这种方式使用双端队列代替向量的开销,为什么priority_queue的默认向量也不是双端队列?(priority_queue需要front(),push_back()和pop_back()-与堆栈基本相同) 根据以下答案进行了更新: 似乎双端队列通常实现的方式是固定大小数组的可变大小数组。这使得它的增长速度比矢量(需要重新分配和复制)的增长速度快,因此对于像堆栈这样的所有元素而言,添加和删除元素都是可行的,双端队列可能是一个更好的选择。 priority_queue需要大量索引,因为每次删除和插入都需要运行pop_heap()或push_heap()。因为添加元素无论如何仍会摊销常量,所以这可能使vector成为更好的选择。
91 c++  stl  containers 

3
wtf是WTF吗?(在WebKit代码库中)
我下载了Chromium的代码库,并遍历了WTF命名空间。 namespace WTF { /* * C++'s idea of a reinterpret_cast lacks sufficient cojones. */ template<typename TO, typename FROM> TO bitwise_cast(FROM in) { COMPILE_ASSERT(sizeof(TO) == sizeof(FROM), WTF_wtf_reinterpret_cast_sizeof_types_is_equal); union { FROM from; TO to; } u; u.from = in; return u.to; } } // namespace WTF 这是否意味着我认为的意思?可能是这样,bitwise_cast这里指定的执行将不会编译如果任一TO或者FROM是不是一个POD,而不是(据我所知)比C ++强大的内置reinterpret_cast。 我在这里看到的唯一亮点是bitwise_castChromium项目中似乎没有人在使用。
91 c++  webkit  chromium 

2
在Android中从C ++调用Java方法
我试图从C ++获得一个简单的Java方法调用,而Java调用本机方法。这是Java代码: public class MainActivity extends Activity { private static String LIB_NAME = "name"; static { System.loadLibrary(LIB_NAME); } /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView tv = (TextView) findViewById(R.id.textview); tv.setText(this.getJniString()); } public void messageMe(String text) { System.out.println(text); } public …

6
未使用的成员变量会占用内存吗?
初始化成员变量而不引用或使用它会在运行时进一步占用RAM,还是编译器只是忽略该变量? struct Foo { int var1; int var2; Foo() { var1 = 5; std::cout << var1; } }; 在上面的示例中,成员'var1'得到一个值,该值然后显示在控制台中。但是,根本不使用“ Var2”。因此,在运行时将其写入内存将浪费资源。编译器会考虑这种情况,而只是忽略未使用的变量,还是Foo对象总是相同大小,而不管其成员是否被使用?
91 c++  memory  struct 

8
使用CMake生成Visual Studio C ++项目文件
我正在开发一个开源C ++项目,用于在Linux和Windows上编译的代码。我使用CMake在Linux上构建代码。为了简化开发设置和政治原因,我必须坚持Windows上的Visual Studio项目文件/编辑器(例如,我不能切换到Code :: Blocks)。我看到了使用CMake生成Visual Studio文件的说明,如此处所示。 您以前使用过CMake生成Visual Studio文件吗?您的经历如何?假设我要向项目添加一个新文件。这是什么工作流程?


3
Lambda的显式返回类型
当我尝试编译此代码(VS2010)时,出现以下错误: error C3499: a lambda that has been specified to have a void return type cannot return a value void DataFile::removeComments() { string::const_iterator start, end; boost::regex expression("^\\s?#"); boost::match_results<std::string::const_iterator> what; boost::match_flag_type flags = boost::match_default; // Look for lines that either start with a hash (#) // or have nothing but white-space …

2
派生类中具有相同名称但签名不同的函数
我有一个同名的函数,但在基类和派生类中具有不同的签名。当我尝试在继承自派生类的另一个类中使用基类的函数时,收到错误消息。请参阅以下代码: class A { public: void foo(string s){}; }; class B : public A { public: int foo(int i){}; }; class C : public B { public: void bar() { string s; foo(s); } }; 我从gcc编译器收到以下错误: In member function `void C::bar()': no matching function for call to `C::foo(std::string&)' candidates are: …

4
运算符<<必须正好接受一个参数
啊 #include "logic.h" ... class A { friend ostream&amp; operator&lt;&lt;(ostream&amp;, A&amp;); ... }; 逻辑文件 #include "a.h" ... ostream&amp; logic::operator&lt;&lt;(ostream&amp; os, A&amp; a) { ... } ... 当我编译时,它说: std :: ostream&逻辑:: operator &lt;&lt;(std :: ostream&,A&)'必须仅接受一个参数。 问题是什么?

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.