如何确保两种类型具有相同的尺寸?

时间:2011-10-05 06:15:10

标签: c visual-studio-2005

在我的代码中,我想确保sizeof(a) == sizeof(b)

第一种方法是让预处理器进行检查:

#if (sizeof(a) != sizeof(b))
#  error sizes don't match
#endif
由于fatal error C1017: invalid integer constant expression而无法编译的

。好的。理解。

接下来尝试:

if(sizeof(a) != sizeof(b)){
  printf("sizes don't match\n");
  return -1;
}

会产生警告:warning C4127: conditional expression is constant

现在,我被困住了。是否有一种警告且无错误的方法来确保两个结构ab具有相同的大小?


修改 编译器是Visual Studio 2005,警告级别设置为4。

4 个答案:

答案 0 :(得分:6)

错误的数组大小

// make sure sizeof(a) == sizeof(b):
int size_must_match[sizeof(a) == sizeof(b)];
// will fail if sizeof(a) == sizeof(b) evaluates to 0
// might produce warning: 'size_must_match' is not used 

// to suppress "'size_must_match' is not used", try:
size_must_match[0]; // might produce warning: "statement has no effect"

typedef int size_must_match[sizeof(a) == sizeof(b)];

编译时算术错误

在C ++中保证这些常量表达式在编译时由编译器进行评估,我相信在C中也是如此:

// make sure sizeof(a) == sizeof(b):
1 / (sizeof(a) == sizeof(b));
// might produce warning: "statement has no effect"

int size_must_match = 1 / (sizeof(a) == sizeof(b));
// might produce warning: 'size_must_match' is unused

assert (1 / (sizeof(a) == sizeof(b)));
// very silly way to use assert!

开关(只是为了好玩)

switch (0) { // compiler might complain that the 
             // controlling expression is constant
case 0:       
case sizeof(a) == sizeof(b):
    ; // nothing to do
}

你明白了。只需使用它,直到编译器100%满意为止。

答案 1 :(得分:2)

根据#if文档明确禁止第一种情况:

  

表达式不能使用sizeof或类型转换运算符。

至于警告,你可以忽略它(因为你知道你的代码没问题),使用#pragma禁用它,或者只是从if中取出条件:

bool sizeMatch = (sizeof(a) == sizeof(b));
if (!sizeMatch){
    printf("sizes don't match\n");
    return -1;
}

编辑:由于禁用错误似乎引起了一些注意,以下是使用#pragma warning实现此目的的几种方法:

#pragma warning (push) 
#pragma warning (disable: 4127)
    if(sizeof(a) != sizeof(b)){
#pragma warning (pop) 
          // ...

显然可以在代码中进一步完成pop。另一种选择可能是:

#pragma warning (disable: 4127)
    if(sizeof(a) != sizeof(b)){
#pragma warning (default: 4127) 

这将在不推动和弹出的情况下重新打开警告。

无论哪种方式,这段代码看起来都很难看。 IMO,只需使用bool获取sizeof比较的结果(如我的第一个代码段所示)将是最干净的解决方案。

答案 2 :(得分:0)

#include <stdio.h>

struct tag {
int a;
};
main() {
    struct tag a,b;
        if(sizeof(a) != sizeof(b))
        printf("not");
    else
        printf("same");

}

这个程序运行正常,没有任何警告...... !!!

答案 3 :(得分:0)

虽然可以使用编译器进行隐藏和搜索,并且在编译器无法看到的地方隐藏常量条件,但这不是抑制警告的最佳方法。它只会使代码看起来不必要地模仿下一个要维护它的人。

如果您需要禁止编译器警告,请明确说明。在Visual Studio 2005中,最好使用编译指示:

http://msdn.microsoft.com/en-us/library/2c8f766e(v=vs.80).aspx