小编ved*_*ved的帖子

C样式/ C++的正确性,是struct/union/enum标签与类型名称相同吗?

以下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使用不同的名称,当一个名称做得很好时:

typedef struct tree_node tree_node;
Run Code Online (Sandbox Code Playgroud)

但我经常看到代码样式如下:

  1. typedef struct tagMyStruct {...} MyStruct;
  2. typedef struct myStruct {...} MyStruct;`
  3. typedef struct _MyStruct {...} MyStruct; <是的,我知道下划线+大写字母

在每种情况下,有人在某种程度上使标签名称类型名称不同.它背后有任何实际原因吗?

旁注:我使用的是C++编译器,但我想与这些定义C兼容(我知道这对c ++来说是不好的风格).出于维护某些调试工具的可用性的原因,我需要所有标记名称都是有意义的(不是自动生成的__unknown_something标记,如果是未命名的结构,您可以,例如,在visual studio类视图中查看).

同样的问题/问题适用于工会和枚举.

c c++ coding-style typedef

13
推荐指数
1
解决办法
1732
查看次数

常量对象不在 rdata/rodata 部分

我无法强制 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。

c++ portable-executable

5
推荐指数
1
解决办法
1168
查看次数

标签 统计

c++ ×2

c ×1

coding-style ×1

portable-executable ×1

typedef ×1