在我的代码中,我想确保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。
现在我被困住了。是否有一种无警告和无错误的方法来确保两个结构a和b具有相同的大小?
编辑:编译器是Visual 2005,警告级别设置为4。
发布于 2011-10-05 06:25:37
根据#if文档,明确禁止使用第一种情况:
表达式不能使用
或类型转换操作符.
至于警告,您可以忽略它(因为您知道您的代码是正常的),使用#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) 这会使警告恢复正常而不会被推和弹出。
不管怎样,这段代码看起来确实很难看。仅使用bool来获得sizeof比较的结果(正如我的第一个片段显示的那样),将是最干净的解决方案。
发布于 2011-10-05 06:29:07
#include <stdio.h>
struct tag {
int a;
};
main() {
struct tag a,b;
if(sizeof(a) != sizeof(b))
printf("not");
else
printf("same");
}这个程序运行良好,没有任何警告.!
发布于 2011-10-05 06:38:43
虽然可以与编译器玩捉迷藏,在编译器看不到的地方隐藏常量条件,但这并不是抑制警告的最佳方法。对于下一个要维护代码的人来说,这只会使代码显得不必要的模糊。
如果需要禁止编译器警告,请明确说明。在Visual 2005中,最好使用语用:
http://msdn.microsoft.com/en-us/library/2c8f766e(v=vs.80).aspx
https://stackoverflow.com/questions/7657362
复制相似问题