相关疑难解决方法(0)

隐藏C结构中的成员

我一直在读C中的OOP,但我从来不喜欢你不能在C++中拥有像你这样的私人数据成员.但后来我想到你可以创建2个结构.一个在头文件中定义,另一个在源文件中定义.

// =========================================
// in somestruct.h
typedef struct {
  int _public_member;
} SomeStruct;

// =========================================
// in somestruct.c

#include "somestruct.h"

typedef struct {
  int _public_member;
  int _private_member;
} SomeStructSource;

SomeStruct *SomeStruct_Create()
{
  SomeStructSource *p = (SomeStructSource *)malloc(sizeof(SomeStructSource));
  p->_private_member = 42;
  return (SomeStruct *)p;
}
Run Code Online (Sandbox Code Playgroud)

从这里你可以将一个结构投射到另一个结构.这被认为是不好的做法吗?还是经常这样做?

c struct private-members

61
推荐指数
6
解决办法
3万
查看次数

如何在C中隐藏结构的声明?

在问题中我们为什么要在C中经常输入一个结构?,放松回答:

在后一种情况下,您不能返回Point by值,因为它的声明对头文件的用户是隐藏的.例如,这是GTK +中广泛使用的技术.

如何完成声明隐藏?为什么我不能按值返回Point?

加:

我理解为什么我不能通过值返回结构,但是,仍然很难理解为什么我不能在我的函数中尊重这一点.即如果我的结构有名为y的成员,为什么我不能这样做?

 pointer_to_struct->y = some_value; 
Run Code Online (Sandbox Code Playgroud)

我为什么要使用方法呢?(像Gtk +)

谢谢你们,再次为我糟糕的英语道歉.

c

10
推荐指数
4
解决办法
1万
查看次数

如何使用Clang查找所有成员字段读/写?

给定一个C++源代码,我想找到每个函数写入和读取的类字段.使用Clang前端的最佳方法是什么?

(我不是要求对所有步骤进行详细解释;但是,有效解决方案的出发点会很棒.)

到目前为止,我尝试使用RecursiveASTVisitor解析语句,但是跟踪节点连接很困难.另外,我无法弄清楚如何跟踪下面的内容:

int& x = m_int_field;
x++;
Run Code Online (Sandbox Code Playgroud)

这明显改变了m_int_field; 但Stmt只要一个人就不可能知道; 所以AST遍历本身似乎不够.

对我来说,一个好处就是可以单独计算字段和子字段(例如,访问成员结构的三个字段).

例:

typedef struct Y {
    int m_structfield1;
    float m_structfield2;
    Y () {
        m_structfield1 = 0;
        m_structfield2 = 1.0f;
    }
} Y;
class X {
    int m_field1;
    std::string m_field2;
    Y m_field3;
public:
    X () : m_field2("lel") {}
    virtual ~X() {}
    void func1 (std::string s) {
        m_field1 += 2;
        m_field2 = s;
    }
    int func2 () {
        return m_field1 + 5;
    }
    void func3 (Y& y) …
Run Code Online (Sandbox Code Playgroud)

c++ static-analysis clang abstract-syntax-tree llvm-clang

6
推荐指数
1
解决办法
1134
查看次数