jjzjj

Declaration

全部标签

c++ - 前向申报的目的是什么?

这是什么描述或含义:例如:classtest;classtest{.....}; 最佳答案 C++(如C)被设计为可由单遍编译器实现。在编译器需要在实际定义类之前知道符号引用类的情况下,前向引用是必要的。典型的例子是当两个类需要包含指向彼此的指针时。即classB;classA{B*b;};classB{A*a;};如果没有对B的前向引用,编译器将无法成功解析A的定义,并且您无法通过将B的定义放在A之前来解决问题。在像C#这样需要二次编译器的语言中,您不需要前向引用classA{Bb;}classB{Aa;}因为编译器的第一遍只是选

c++ - C中的这些声明有什么区别?

在C和C++中,以下声明的作用是什么?constint*i;int*consti;constvolatileintip;constint*i;以上声明是否有误?如果不是,它们之间的含义和区别是什么?上述声明的有用用途是什么(我的意思是在什么情况下我们必须在C/C++/嵌入式C中使用它们)? 最佳答案 constint*i;i是指向常量整数的指针。i可以更改为指向不同的值,但不能更改i指向的值。int*consti;i是指向非常量整数的常量指针。i指向的值可以更改,但不能更改i以指向不同的值。constvolatileintip;这个

c++ - for循环中的混合声明

我想写一个for循环,如下所示;在初始化部分,我想声明不同类型的变量:for(intloop=0,longresult=1;loop但它给出了错误,意味着它是不允许的。有什么解决办法吗? 最佳答案 不要这样写代码。这是减速带代码,总有一天有人会读到这个然后去Whoa!并浪费他5分钟的时间来弄清楚你为什么这样做。那是他永远不会回来的5分钟,你会无缘无故地欠他。如果限制result的范围真的那么重要,那么使用额外的一组大括号:{longresult=1;for(intloop=0;loop现在将其放在首位,您将编写出不仅可读而且可重用的

c++ - 使用数组作为元组成员 : Valid C++11 tuple declaration?

下面的代码可以在G++4.7.2中正常编译:#includestd::tuplex;但是,使用clang++3.2会产生以下错误:错误:数组初始化器必须是一个初始化器列表。如果我从元组声明中删除float类型,错误就会消失。上面的元组声明是否有效?($CXX-std=c++11-c文件.cpp) 最佳答案 我认为标准中没有任何内容禁止您的声明。但是,一旦尝试初始化、复制、移动或分配元组,就会遇到问题,因为对于这些操作,元组的所有成员类型都必须能够用作初始化器、可复制构造、可复制分配和移动分配,分别(§20.4.2.1)。这些都不是数

c++ - T D[N] 是否总是声明数组类型的对象?

我对[dcl.array]/1感到困惑:InadeclarationTDwhereDhastheform          D1[constant-expressionopt]attribute-specifier-seqoptandthetypeoftheidentifierinthedeclarationTD1is“derived-declarator-type-listT”,thenthetypeoftheidentifierofDisanarraytype;...考虑声明:int(*p)[42];这个声明满足上面描述的语法(不满足前面段落描述的语法),所以这个段落应该适用,因此

c++ - 声明 typedef 类型

structmystruct{inti;doublef;};typedefmystructmyotherstruct;//theother.cppfilestructmystruct;//OK,thisisacorrectforwarddeclaration.structmyotherstruct;//errorC2371(invc2k8):'myotherstruct':redefinition;differentbasictypes大家好。为什么我不能转发声明myotherstruct? 最佳答案 myotherstruct标识

c++ - 什么时候 namespace::function() 声明有用?

单个文件示例这是一个使用命名空间的简单程序。#includenamespacefoo{voidhello();}voidfoo::hello(){std::cout这个程序可以很好地编译并产生预期的输出。$./a.outhello我想知道什么时候voidfoo::hello();声明有用?在这个程序中,显然这个声明是多余的。但既然存在这种语法,这在其他一些场景中一定有用吗?双文件示例这是一个示例,表明voidfoo::hello();单独声明是无用的。//foo.cpp#includenamespacefoo{voidhello();}voidfoo::hello(){std::cou

c++ - 什么是 C++ 中用于分离 header /源的模板特化的可靠方法

在中等规模甚至大型复杂项目中,分离模板声明和定义很有用以减少编译时间。然而,在复杂的代码中,小的程序员错误可能会导致不被注意的行为改变,例如调用通用版本而不是专用版本。例子:由于错过声明,模板特化变得不可见。/////////////////////fileA.hpp/////////////////////#includetemplateclassA{public:voidfoo(){std::cerrvoidA::foo();/////////////////////fileA-foo-int.cpp/////////////////////#include"A.hpp"templ

c++ - 扭曲的逻辑 : a global variable in one file refers to an extern variable but is also referred by that extern variable

文件A.cpp:#includeexternintiA;externintiB=iA;intmain(){std::cout文件B.cppexternintiB;externintiA=2*iB;编译链接运行,out进来debug和release模式是0,0我的问题是它是如何工作的,为什么在链接阶段没有问题?我正在使用VC++2003。 最佳答案 初始化程序覆盖了extern关键字,因此这没有什么“神奇”:您只是在不同的翻译单元中声明和定义两个完全不相关的变量。来自StandardforProgrammingLanguageC++-

c++ - C++ 声明中的显式限定

当第一个声明被注释掉时,以下命名空间定义无法编译。如果foo的第一个声明未被注释,那么它编译得很好。namespaceY{//voidfoo();void::Y::foo(){}}标准(§8.3¶1)中的相关部分说:Whenthedeclarator-idisqualified,thedeclarationshallrefertoapreviouslydeclaredmember我了解此规则可防止将名称引入其他命名空间。我想知道是否可以放宽该规则以允许qualified-id引用当前命名空间。 最佳答案 CWG#482是相关的:Ac