C++ 在sizeof命令的extern语句中指定字符数组大小

C++ 在sizeof命令的extern语句中指定字符数组大小,c++,c,visual-studio-2010,C++,C,Visual Studio 2010,有 char B[200]; 在静态库中。它被称为 extern char B[]; // (1) 在客户端代码中包含的标头中。 有一次我需要使用sizeof(B)compiler并更改为 extern char B[200]; // (2) 平静下来 库和客户端代码是C++,但它使用C链接(由/pp>包围的头的外部声明 extern "C" { ... } 如果我使用(2)而不是(1),是否存在任何潜在问题 p.S.为了简单起见,我把200放进去。它是库附带的头文件中定义的常量 库标

char B[200];
在静态库中。它被称为

extern char B[];  // (1)
在客户端代码中包含的标头中。 有一次我需要使用
sizeof(B)
compiler并更改为

extern char B[200]; // (2)
平静下来

库和客户端代码是C++,但它使用C链接(由/pp>包围的头的外部声明
extern "C" { ... }
如果我使用(2)而不是(1),是否存在任何潜在问题

p.S.为了简单起见,我把200放进去。它是库附带的头文件中定义的常量

库标题:

#define MAXLEN 200
实际上,即使它不是一个库,但在一个单独的文件(编译单元)中,问题也是类似的


有没有什么方法(1)可以用在这个大的旧代码中,我可以用(2)来打破它?

如果库实现更改了
B
的大小,您将有一个不匹配的错误,可能需要查找各种错误。库编写器应该提供一个描述数组大小的常量。如注释中所述,库编写器可以通过一个常量或用术语编写的函数轻松提供这一点使其对库中的更改具有很强的弹性。

我也有同样的问题。本文对此进行了解释


很明显,但我以前没有考虑过:)

实际上,库应该定义
const size\u t BSIZE=sizeof(B)
外部常量大小在其标题中,或者可能使用函数返回大小(函数方法更适用于共享库和定位独立代码)。提供BSIZE是一个很好的建议。谢谢但为了简单起见,我加了200。有一个常量
MAXLEN
,它在库附带的标题中是
#define
-ed,因此它将始终是相同的。有没有什么方法可以(1)用在这个大的旧代码中,我可以用(2)来打破它?然后使用
extern char B[MAXLEN];//(2) 
相反,这样可以避免潜在的大小不匹配。您应该为宏使用更准确、更具体的名称,或者有人可能会使用已使用名为“MAXLEN”的宏的宏,因为MAXLEN非常通用。。。(就像macs
check()
macro..*GRRR*)而不是使用“MYLIB\u MAXLEN”或“B\u ARRAY\u LEN”之类的东西similar@Seyran:您的更改不应破坏任何内容-可以在旧的不完整定义无法使用的地方使用
B
的完整定义。它不会在可以使用旧
B
的任何地方返回不同的结果。