Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 区别于;类型定义声明“;及;类别声明“;_C++_Class_Typedef - Fatal编程技术网

C++ 区别于;类型定义声明“;及;类别声明“;

C++ 区别于;类型定义声明“;及;类别声明“;,c++,class,typedef,C++,Class,Typedef,问题很简单。为了进一步澄清,以下代码中的Foo1和Foo2在声明方式上有什么区别(例如,一个使用class Foo1{…};而另一个使用typedef class{…}Foo2;) 我相信第二个是C所必需的,但是C++是不必要的。在内部,我相信第二个是创建一个未命名的类,然后为此创建一个typedef,而第一个只是创建类 我不认为在C++库中需要TyPulf风格类声明。 < P>我相信第二个是C所必需的,但是对于C++来说是不必要的。在内部,我相信第二个是创建一个未命名的类,然后为此创建一个ty

问题很简单。为了进一步澄清,以下代码中的
Foo1
Foo2
在声明方式上有什么区别(例如,一个使用
class Foo1{…};
而另一个使用
typedef class{…}Foo2;


<>我相信第二个是C所必需的,但是C++是不必要的。在内部,我相信第二个是创建一个未命名的类,然后为此创建一个typedef,而第一个只是创建类


<>我不认为在C++库中需要TyPulf风格类声明。

< P>我相信第二个是C所必需的,但是对于C++来说是不必要的。在内部,我相信第二个是创建一个未命名的类,然后为此创建一个typedef,而第一个只是创建类


<>我不认为在C++库中需要TyPulf风格类声明。

< P>差异很细微。在第一种情况下,您正在创建一个名为
Foo1
的类,而在第二种情况下,您正在创建一个annonymous类,并使用
typedef
提供别名
Foo2

第三种选择是:

typedef class Foo3 {
public:
   void bar() {}
} Foo3;
这将创建一个名为
Foo3
的类,并创建一个别名
Foo3
来引用它

微妙之处在于如何在语言中处理标识符。当代码中存在标识符时,编译器将执行查找以了解其含义。查找将在每个范围内进行检查,首先在定义了大多数符号(不包括用户定义的类型)的全局标识符空间中进行检查,如果无法在其中找到标识符,则将在用户定义的标识符空间中进行查找。用户定义的类型属于第二个标识符空间,而
typedef
-ed名称位于第一个组中。只有当两个查找都失败时,编译器才会转到下一个封闭范围

要提供差异显著的简单测试用例,请执行以下操作:

class A {};
typedef class {} B;
typedef class C {} C;
void A();              // correct: no collision
//void B();            // error, identifier B already used with a different meaning!
//void C();            //   "
namespace test {
   void B();
   void C();
   void f() {
      class A a;       // creates variable of type ::A
      A();             // calls function ::A
      B();             // calls function test::B()
      //class B b;     // error: B does not denote a user-defined type name
      C();             // calls function test::C()
      class C c;       // creates variable of type ::C
   }
}

差别是微妙的。在第一种情况下,您正在创建一个名为
Foo1
的类,而在第二种情况下,您正在创建一个annonymous类,并使用
typedef
提供别名
Foo2

第三种选择是:

typedef class Foo3 {
public:
   void bar() {}
} Foo3;
这将创建一个名为
Foo3
的类,并创建一个别名
Foo3
来引用它

微妙之处在于如何在语言中处理标识符。当代码中存在标识符时,编译器将执行查找以了解其含义。查找将在每个范围内进行检查,首先在定义了大多数符号(不包括用户定义的类型)的全局标识符空间中进行检查,如果无法在其中找到标识符,则将在用户定义的标识符空间中进行查找。用户定义的类型属于第二个标识符空间,而
typedef
-ed名称位于第一个组中。只有当两个查找都失败时,编译器才会转到下一个封闭范围

要提供差异显著的简单测试用例,请执行以下操作:

class A {};
typedef class {} B;
typedef class C {} C;
void A();              // correct: no collision
//void B();            // error, identifier B already used with a different meaning!
//void C();            //   "
namespace test {
   void B();
   void C();
   void f() {
      class A a;       // creates variable of type ::A
      A();             // calls function ::A
      B();             // calls function test::B()
      //class B b;     // error: B does not denote a user-defined type name
      C();             // calls function test::C()
      class C c;       // creates variable of type ::C
   }
}

差别在于:第二个是混淆C++程序员,并且不能在声明中实例化任何实例。@ MOOIGED-鸭-为什么不把它作为答案?@ LITTLADV:可能是因为混淆是主观的…我知道有不少C++程序员不会混淆(有些甚至理解差异):第二个是混淆C++程序员,并且不能在声明中实例化任何实例。@穆奥格-鸭-为什么不把它作为答案?@利特尔ADV:可能是因为混淆是主观的…我知道有相当多的C++程序员不会混淆(有些人甚至理解差异)我好奇,为什么Type是第一组?@ PuBy8:这是来自C的C.,除非程序员明确请求,否则编译器不会检查用户定义的类型:
struct A
将仅在用户定义的类型内进行查找,而
A()
将仅在常规标识符范围内进行查找。在C语言中,
typedef
的目的是在其他标识符空间中创建一个别名,这样您就不需要告诉编译器您在所有用法中都引用了一个类型:
typedef struct a{}a;A A
会找到
A
作为typedef名称,用户可以跳过在每次使用类型之前添加
struct
。@DavidRodríguez dribeas第二种情况更微妙:“如果typedef声明定义了一个未命名的类(或enum),那么声明声明的第一个typedef名称就是该类类型(或枚举类型)用于表示仅用于链接目的的类类型(或枚举类型)。(§7.1.3/9.不要问我“仅用于链接目的”的确切含义。)@JamesKanze:正如我不久前所理解的,这意味着查找将按照上面所述执行,但是由于名称混乱需要类型的名称,以及成员函数,它必须选择第一个typedef的名称。我相信,在模板实例化中曾经有另一种情况,第一个typedef名称将再次被使用d来标识要触发的实例化
typedef struct{}A;typedef A B;std::vector v1;std::vector v2;
两者都实例化了
std::vector
的等价物,但我认为这些都有点超出了它们的基本功能描述…@DavidRodríguez dribeas你的理解听起来和其他任何东西一样合理。但是类型是否有名称会产生一些影响:如果你没有如果你不能给它命名(直接或通过typedef),那么有些事情你就不能用它来做,比如实例化一个模板,或者在不同的源代码中引用它。我很好奇,为什么typedef会在第一组中?@Pubby8:This c