如何在C中创建编译时条件检查

时间:2014-09-09 20:36:58

标签: c compilation structure

问题是由于一些不可避免的原因,我需要在C代码中维护2个相同结构的副本。 有没有办法我可以添加一些编译器检查,以确保有人更改(添加/删除/修改)其中一个人应该更新副本的结构?

我能想到的两个解决方案是:

  1. 我可以将评论作为请求添加到任何进行更改的人(非常不可靠)
  2. 我可以将字段的offsetof()用作运行时检查
  3. 但是我正在寻找可以在编译期间确保这一点的东西。

3 个答案:

答案 0 :(得分:0)

没有完美的方法。

您可以使用C compiler asserts - how to implement?

中的静态断言宏

然后断言每个结构的sizeof是相同的。但这并不意味着它们是相同的。

可能更好的方法是添加一些代码生成,以便从原始版本生成副本的部分版本。

但是,当你不得不复制某些东西而不是重复使用时,最终会出现问题。

答案 1 :(得分:0)

仅允许struct doublestruct *和全局支持函数(如ds_foo(struct doublestruct *, ...))对其余代码可见。然后,文件ds.c可以控制对struct doublestruct的所有访问,并保留冗余副本。

// ds.h
struct doublestruct *ds_Init();
void ds_setA(struct doublestruct *ds, int A);
int ds_getA(const struct doublestruct *ds);


// ds.c
struct doublestruct {
  int A;
  double B;
  char C;
};

#include <stdlib.h>

struct doublestruct * ds_Init() {
  struct doublestruct *p = malloc(sizeof *p *2);
  if (p) memset(p, 0, sizeof *p * 2);
  return p;
}

void ds_setA(struct doublestruct *ds, int A) {
  ds[0].A = A;
  ds[1].A = A;
}

int ds_getA(const struct doublestruct *ds) {
  if (ds[0].A != ds[1].A) exit(-1);  // Memory failure
  return ds[0].A;
}

答案 2 :(得分:0)

我认为应对这种情况的正确方法是对结构定义进行某种签名并在制作时进行检查,以便检查修改。

  1. 首先,标记此类型的结构,以便您可以访问它们 很容易:类似“ _some_tag _ ”的内容#define'd as nothing in 某些标题允许您自动搜索它。
  2. 然后,使用某种开发工具来解析字段,对它们进行分析 并作出一些哈希函数。
  3. 为将来的编辑注册此签名,并警告编译团队 结构改变。
  4. 想想,你最好是过度投诉而不是下,所以在结构修改的情况下,你至少会得到一个指示。

    假设你有:

    struct A { bla bla bla };
    

    然后将其修改为:

    #include <somefile where you have defined macro ___hash_protected___>
    /* #define ___hash_protected___ */
    ...
    struct ___hash_protected___ A { bla bla bla };
    

    现在,编写一个搜索该标记的程序,计算结构A的签名并使用存储在数据库文件中的值进行检查。它必须做两件事:首先计算结构的哈希值,然后将其与保存的值进行比较,并在它们不同时发出警告。如果结构是新的,只需将哈希值添加到数据库中。

    我想保护它免受未经授权的使用,只需使用加密安全散列函数(例如SHA256)并使用前面的某个秘密字符串保护它。

    当然,您必须至少解析结构定义才能计算出有效的哈希值。

    但是,记住,最好在公共包含文件中定义它,而不是定义它两次。我知道有些情况下必须分发一个定义文件才能在多个地方使用,导致它的版本可能不同。