在我的代码中,我想确保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 Studio 2005,警告级别设置为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