在一个应该能够在C和C++文件中编译的头文件中,在Visual Studio(2010)和MinGW(32位 - v3.4.5,64位 - v4.5.0)中,我试图通过更改每个文件来最小化其中一条线(有许多线):
// for symbol A
#ifdef __GNUC__
# warning Symbol A is deprecated. Use predefined const cnA instead.
#else
# pragma message("Symbol A is deprecated. Use predefined const cnA instead.")
#endif
// Same for B
// Same for C
// . . .
Run Code Online (Sandbox Code Playgroud)
至
// define this once:
#ifdef __GNUC__
# define X_Warning(x) #warning "Symbol " x " is deprecated. Use cn" x // (1)
#else
# define X_Warning(x) __pragma(message("Symbol " x " is deprecated. …
Run Code Online (Sandbox Code Playgroud) sizeof () 返回结构的大小,包括用于对齐的成员填充。这很好。不需要将结构打包为 0 padding。
只需要获取(或计算)要比较的结构成员大小的总和(在静态编译时 assert 中使用它)。
当您的成员规模较小时,他们的缺席/差异不会被发现。成员主要是char数组
是否可以在编译时(或运行时)获得该数字?
或者我还能如何确保“有效”大小符合我的预期并避免因程序制动而意外更改?
初衷是为了避免错误地将A或B修改为不同的错误。使用 STATIC_ASSERT( sizeof(A) == sizeof(B) ) 由于填充而不适用于某些“小”差异。
注意:A 和 B 应该相似,但是在给定的设计中,不可能在程序的两个部分中重用 A。这个检查是为了确保如果有人只更改了 A 或只更改了 B,则无法编译。
有
char B[200];
Run Code Online (Sandbox Code Playgroud)
在静态库中.它被称为
extern char B[]; // (1)
Run Code Online (Sandbox Code Playgroud)
在客户端代码中包含的标头中.一旦我需要使用sizeof(B)
编译器抱怨并改变
extern char B[200]; // (2)
Run Code Online (Sandbox Code Playgroud)
平稳的编译器.
库和客户端代码是c ++,但它使用C链接(头部的extern声明包围
extern "C" { ... }
Run Code Online (Sandbox Code Playgroud)
如果我使用(2)而不是(1),是否有任何潜在的问题?
PS我把200放在简单.它是库附带的头文件中定义的常量.
库头:
#define MAXLEN 200
Run Code Online (Sandbox Code Playgroud)
实际上,即使它不是一个库,但在一个单独的文件(编译单元)中,问题也是类似的.
有没有办法(1)可以在这个大的旧代码中使用,我可能会使用(2)打破?
在表T中,我试图删除具有相同A值的组中的所有记录,但仅当该组的所有成员都将B设置为"x"时.
鉴于表T:
+-------+--------+
| A | B |
+-------+--------+
| 2 | '' |
| 2 | 'x' |
| 2 | '' |
| 8 | 'x' |
| 8 | 'x' |
| 15 | '' |
| 15 | '' |
+-------+--------+
Run Code Online (Sandbox Code Playgroud)
必须删除A == 8的两个记录,因为它们中的所有两个都具有B == 1.A == 2的组具有B的混合值,因此它保持不变.并且A == 15的组没有全部B等于1它也保持不变.
这可以通过一个查询来完成吗?
如果没有,任何其他方式对于具有大量记录的表来说足够快?