是否可以在编译时打印出C++类的大小?

Tim*_*ell 61 c++

是否有可能在编译时确定C++类的大小?

我似乎记得模板元编程方法,但我可能会弄错...


抱歉没有更清楚 - 我希望在构建输出窗口中打印大小

gre*_*rep 131

如果您确实需要在编译器输出中获取sizeof(X),则可以将其用作不完整模板类型的参数:

template<int s> struct Wow;
struct foo {
    int a,b;
};
Wow<sizeof(foo)> wow;

$ g++ -c test.cpp
test.cpp:5: error: aggregate ‘Wow<8> wow’ has incomplete type and cannot be defined
Run Code Online (Sandbox Code Playgroud)

  • 如果您不想要错误,只需要警告,请将其用作完整类型的模板参数,然后定义该类型的其他未使用对象.即`哇<sizeof(foo)> unused_warning;`. (3认同)

小智 13

要回答更新的问题 - 这可能有点过分,但它会在编译时打印出类的大小.Visual C++编译器中有一个未记录的命令行开关,它将显示类的完整布局,包括它们的大小:

该开关是/ d1reportSingleClassLayoutXXX,其中XXX对类名执行子串匹配.

http://blogs.msdn.com/vcblog/archive/2007/05/17/diagnosing-hidden-odr-violations-in-visual-c-and-fixing-lnk2022.aspx


Jav*_*Man 5

另一个简单代码的技巧:

int dummy;
switch (dummy) {
case sizeof(dummy):
case sizeof(dummy):
 break;
}
Run Code Online (Sandbox Code Playgroud)

------构建开始:项目:cpptest,配置:调试Win32 ------> cpptest.cpp c:\ work\cpptest\cpptest\cpptest.cpp(33):错误C2196:案例值'4 ' 已被占用

==========构建:0成功,1失败,0最新,0跳过==========

编辑:dummy上面是切换条件的一些积分变量,以满足所需的语法.使用sizeof(X)的情况下,不断:

这也适用于C代码.

struct X {
    int a,b;
    int c[10];
};
int _tmain(int argc, _TCHAR* argv[])
{
    int dummy;

    switch (dummy) {
    case sizeof(X):
    case sizeof(X):
        break;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

------构建开始:项目:cpptest,配置:调试Win32 ------ cpptest.cpp c:\ work\cpptest\cpptest\cpptest.cpp(29):错误C2196:大小写值'48'已经使用==========构建:0成功,1失败,0最新,0跳过==========