我在cppreference中看到了这一点。
在范围内查找名称会查找该名称的所有声明,只有一个例外,即“结构hack”或“类型/非类型隐藏”:在同一范围内,名称的某些出现可能引用了声明的
class/struct/union/enum这不是一个typedef,而具有相同名称的所有其它出现要么全部指代相同的变量,非静态数据成员(因为C ++ 14),或枚举,或者它们都指可能过载功能或功能模板名字
上面文本的链接在这里
我不明白什么是“结构破解”和“类型/非类型隐藏”。
他们是同一概念吗?你能给个简单的解释吗?进行摘要演示会很好。
在我正在研究的一些C++代码中,我经常看到类似下面的代码:
typedef class SomeClass SomeClass;
Run Code Online (Sandbox Code Playgroud)
我对这实际上取得的成就感到困惑.看起来这不会改变任何事情.这样做typedef是什么意思?如果这样做有用,是否值得付出额外的努力?
这个答案说:
......最后,
Run Code Online (Sandbox Code Playgroud)typedef struct { ... } Foo;声明一个匿名结构并为其创建一个typedef.因此,使用此构造,它在标记名称空间中没有名称,只有typedef名称空间中的名称.这意味着它也无法向前宣布.如果要进行前向声明,则必须在标记名称空间中为其指定名称.
什么是前瞻性声明?
以下两个定义之间的任何方面(句法限制,性能等)是否有任何差异?
using Foo = struct { int a, b, c; };
struct Foo { int a, b, c; };
Run Code Online (Sandbox Code Playgroud)
(我问的是,因为第一种形式在许多using声明中放在美学上更均匀.)
编辑:评论中链接的帖子并不完全回答我的问题.我更关注上述两个定义在使用方面的差异,而那篇文章主要回答了它们是如何区别的,以及它们是什么,我认为.
以下是C中的等价物吗?
// #1
struct myStruct {
int id;
char value;
};
typedef struct myStruct Foo;
// #2
typedef struct {
int id;
char value;
} Foo;
Run Code Online (Sandbox Code Playgroud)
如果没有,我应该使用哪一个以及何时使用?
以下代码不编译 g ++ 4.8.1
struct Layers
{
typedef struct Widgets { } Widgets;
virtual void fun(void)
{
struct Widgets w;
}
Widgets w, x, y, z ;
};
Run Code Online (Sandbox Code Playgroud)
但是,如果我只是使用Widgets w, x, y ; //Remove variable z它编译!
为什么会这样?我在这里错过了什么?
我目前正在学习structC中的数据结构,以及如何用typedef关键字为这个结构做准备.这会导致实际结构的变量名称放在不同的名称空间中,如以下几个不同的引用中所述:
C++中'struct'和'typedef struct'之间的区别?
typedef struct vs struct definitions
但是,我不清楚我正在使用的示例中发生了什么:
#include <stdio.h>
struct demo
{
short low_pass_vcf;
short filter_coupler;
short reverb;
short sequential;
} synth;
int main()
{
printf("Size of struct: %i\n", sizeof(struct demo));
printf("Size of struct: %i\n", sizeof(synth));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我能够struct通过synth变量名访问数据结构; 然而,在我看到的例子中,为了让我能够做到这一点,struct需要以此为前提typedef.在这个例子中,typedef没有使用,但我仍然能够引用这个结构synth.我想知道C允许我这样做到底发生了什么?任何解释将不胜感激.干杯.
使用boost python我需要创建嵌套的命名空间.
假设我有以下cpp类结构:
namespace a
{
class A{...}
namespace b
{
class B{...}
}
}
Run Code Online (Sandbox Code Playgroud)
明显的解决方案不起作用:
BOOST_PYTHON_MODULE( a ) {
boost::python::class_<a::A>("A")
...
;
BOOST_PYTHON_MODULE(b){
boost::python::class_<a::b::B>("B")
...
;
}
}
Run Code Online (Sandbox Code Playgroud)
它会导致编译时错误: linkage specification must be at global scope
有没有办法声明可以从Python访问的B类a.b.B?
在文件范围,以下是类型声明还是未命名变量?
struct student_s {
char* name;
int age;
double height;
struct student_s* next;
};
Run Code Online (Sandbox Code Playgroud)
如果是类型定义,那么有什么区别:
typedef struct student_s {
char* name;
int age;
double height;
struct student_s* next;
};
Run Code Online (Sandbox Code Playgroud)
?
(背景:请参阅我的答案将变量从全局变为本地 - C,我相信第一个引入了一个未命名的变量,然后由编译器对其进行优化.)
注意:该问题已被标记为可能重复的结构成员标识符放在什么范围内?但我相信我并不是在询问有关成员范围的问题,而是对申报实际创造的内容提出疑问.然而.回答C++中'struct'和'typedef struct'的区别?解释我的问题.
我只是在C++的上下文中提问.
struct x1 { ... };
typedef struct { ... } x2;
int main()
{
x1 a;
x2 b;
}
Run Code Online (Sandbox Code Playgroud)