小编sny*_*sny的帖子

把#warning放在#define的体内

在一个应该能够在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)

c c++ mingw visual-studio-2010

6
推荐指数
1
解决办法
2277
查看次数

填充结构的实际大小,(成员大小的总和,没有填充对齐)

sizeof () 返回结构的大小,包括用于对齐的成员填充。这很好。不需要将结构打包为 0 padding。

只需要获取(或计算)要比较的结构成员大小的总和(在静态编译时 assert 中使用它)。

当您的成员规模较小时,他们的缺席/差异不会被发现。成员主要是char数组

是否可以在编译时(或运行时)获得该数字?

或者我还能如何确保“有效”大小符合我的预期并避免因程序制动而意外更改?

初衷是为了避免错误地将A或B修改为不同的错误。使用 STATIC_ASSERT( sizeof(A) == sizeof(B) ) 由于填充而不适用于某些“小”差异。

注意:A 和 B 应该相似,但是在给定的设计中,不可能在程序的两个部分中重用 A。这个检查是为了确保如果有人只更改了 A 或只更改了 B,则无法编译。

c linux gcc visual-studio-2010

5
推荐指数
1
解决办法
576
查看次数

在sizeof命令的extern语句中指定char数组大小

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)打破?

c c++ visual-studio-2010

3
推荐指数
1
解决办法
1482
查看次数

SQL DELETE基于相反组的记录组为空

在表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它也保持不变.

这可以通过一个查询来完成吗?

如果没有,任何其他方式对于具有大量记录的表来说足够快?

sql oracle oracle11g

1
推荐指数
1
解决办法
381
查看次数

标签 统计

c ×3

visual-studio-2010 ×3

c++ ×2

gcc ×1

linux ×1

mingw ×1

oracle ×1

oracle11g ×1

sql ×1