首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何确保两种类型的大小相同?

如何确保两种类型的大小相同?
EN

Stack Overflow用户
提问于 2011-10-05 06:15:09
回答 3查看 442关注 0票数 6

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

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

代码语言:javascript
复制
#if (sizeof(a) != sizeof(b))
#  error sizes don't match
#endif

因为fatal error C1017: invalid integer constant expression而不能编译。好吧。明白了。

下一个尝试:

代码语言:javascript
复制
if(sizeof(a) != sizeof(b)){
  printf("sizes don't match\n");
  return -1;
}

这导致了一个警告:warning C4127: conditional expression is constant

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

编辑:编译器是Visual 2005,警告级别设置为4。

EN

回答 3

Stack Overflow用户

发布于 2011-10-05 06:25:37

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

表达式不能使用

或类型转换操作符.

至于警告,您可以忽略它(因为您知道您的代码是正常的),使用#pragma禁用它,或者直接从if中去掉条件。

代码语言:javascript
复制
bool sizeMatch = (sizeof(a) == sizeof(b));
if (!sizeMatch){
    printf("sizes don't match\n");
    return -1;
}

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

代码语言:javascript
复制
#pragma warning (push) 
#pragma warning (disable: 4127)
    if(sizeof(a) != sizeof(b)){
#pragma warning (pop) 
          // ...

很明显,pop可以在代码的更远的地方完成。另一种选择可以是:

代码语言:javascript
复制
#pragma warning (disable: 4127)
    if(sizeof(a) != sizeof(b)){
#pragma warning (default: 4127) 

这会使警告恢复正常而不会被推和弹出。

不管怎样,这段代码看起来确实很难看。仅使用bool来获得sizeof比较的结果(正如我的第一个片段显示的那样),将是最干净的解决方案。

票数 2
EN

Stack Overflow用户

发布于 2011-10-05 06:29:07

代码语言:javascript
复制
#include <stdio.h>

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

}

这个程序运行良好,没有任何警告.!

票数 0
EN

Stack Overflow用户

发布于 2011-10-05 06:38:43

虽然可以与编译器玩捉迷藏,在编译器看不到的地方隐藏常量条件,但这并不是抑制警告的最佳方法。对于下一个要维护代码的人来说,这只会使代码显得不必要的模糊。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7657362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档