以下MyStruct(标记MyStruct)的定义和MyStruct类型的类型定义似乎完全可以通过gcc(至少4.6.2)和g ++来完成.
typedef struct MyStruct {
int a;
int b;
} MyStruct;
Run Code Online (Sandbox Code Playgroud)
我的问题是:它是否容易出错(在C和/或C++中)或使用标签名称与类型名称相同的错误样式?
根据http://www.eetimes.com/discussion/programming-pointers/4024450/Tag-vs-Type-Names,它不是:
我永远不明白为什么他们为标签和typedef使用不同的名称,当一个名称做得很好时:
Run Code Online (Sandbox Code Playgroud)typedef struct tree_node tree_node;
但我经常看到代码样式如下:
typedef struct tagMyStruct {...} MyStruct;typedef struct _MyStruct {...} MyStruct; <是的,我知道下划线+大写字母在每种情况下,有人在某种程度上使标签名称与类型名称不同.它背后有任何实际原因吗?
旁注:我使用的是C++编译器,但我想与这些定义C兼容(我知道这对c ++来说是不好的风格).出于维护某些调试工具的可用性的原因,我需要所有标记名称都是有意义的(不是自动生成的__unknown_something标记,如果是未命名的结构,您可以,例如,在visual studio类视图中查看).
同样的问题/问题适用于工会和枚举.
我无法强制 msvc10 将 const 对象放入 .rdata 部分。它总是以 .data 结尾,完美初始化(意味着没有动态初始化/运行时构造函数执行)。(使用“发布”构建的标准项目设置进行编译)。我不明白为什么以下代码不能将 'obj1' 放入 .rdata PE 部分:
typedef struct _Struct1 {
int m1;
_Struct1(int p1): m1(p1) {};
_Struct1() {};
} Struct1;
class Class1 {
public:
Class1() {};
Class1(int p1, int p2): m1(p1), m2_struct(p2) {};
int m1;
Struct1 m2_struct;
};
const Class1 obj1(1, 2);
int main() {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么 obj1 不转到 rdata(在 IDA 中检查)以及在当前情况下如何强制它?Tnx。