MCD中Compile-Time Assertions 例程问题

fallening 2009-04-28 04:20:53
Modern C++ Design 中 2.1 Compile-Time Assertions 提供了一段运行时检查的代码,但是发现无法通过编译

$ cat check.cc


//书中代码片段
template<bool> struct CompileTimeChecker
{
CompileTimeChecker(...);
};

template<> struct CompileTimeChecker<false> { };

#define STATIC_CHECK(expr, msg) \
{\
class ERROR_##msg {}; \
(void)sizeof(CompileTimeChecker<((expr) != 0)>((ERROR_##msg())));\
}

//测试代码
int main()
{
STATIC_CHECK( 1==2, one_is_two );

return 0;
}


期待这样的错误信息:Error: Cannot convert ERROR_one_is_two to CompileTimeChecker <false>,但是实际信息为:
(1) gcc 报奇怪的错误
$ g++ -o check check.cc -Wall
check.cc: In function ‘int main()’:
check.cc:17: error: invalid application of ‘sizeof’ to a function type
(2)icc 居然通过编译了
$ icpc -o check check.cc -Wall
check.cc(17): warning #56: operand of sizeof may not be a function
STATIC_CHECK( 1==2, one_is_two );
^

请高手指点:)
...全文
180 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
fallening 2009-04-29
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 taodm 的回复:]
你开了-std=c++0x没有?
[/Quote]
阿,是我的疏忽

[Quote=引用 19 楼 taodm 的回复:]
23 C:\temp\main.cpp [Warning] invalid application of 'sizeof' to a function type
我用的gcc4.4 for windows,就一个小小warning
所以,建议你再想想
1 为什么这么好的想法,没有实现入loki产品库
2 为什么要有这个sizeof
[/Quote]
谢谢提点:)
我好好想想,不会再来请教:)
taodm 2009-04-28
  • 打赏
  • 举报
回复
23 C:\temp\main.cpp [Warning] invalid application of 'sizeof' to a function type
我用的gcc4.4 for windows,就一个小小warning
所以,建议你再想想
1 为什么这么好的想法,没有实现入loki产品库
2 为什么要有这个sizeof
taodm 2009-04-28
  • 打赏
  • 举报
回复
你开了-std=c++0x没有?
fallening 2009-04-28
  • 打赏
  • 举报
回复
1楼的代码,用gcc 4.4编译,错误还是一样的,奇怪。

$ g++ -v
Using built-in specs.
Target: x86_64-unknown-linux-gnu
Configured with: ../configure --prefix=/usr --enable-shared --enable-languages=c,c++,fortran,objc,obj-c++ --enable-threads=posix --mandir=/usr/share/man --infodir=/usr/share/info --enable-__cxa_atexit --disable-multilib --libdir=/usr/lib --libexecdir=/usr/lib --enable-clocale=gnu --disable-libstdcxx-pch --with-tune=generic
Thread model: posix
gcc version 4.4.0 (GCC
taodm 2009-04-28
  • 打赏
  • 举报
回复
我用的4.4,编译正常,连warning都没有。
fallening 2009-04-28
  • 打赏
  • 举报
回复
汗,以为taodm说的是新出的4.4,其实我正在用的是4.3
fallening 2009-04-28
  • 打赏
  • 举报
回复
貌似在testing中,一会儿装上看看
taodm 2009-04-28
  • 打赏
  • 举报
回复
呵呵,愿你有空试过gcc4.x。
fallening 2009-04-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 taodm 的回复:]
你可以看一下loki源码包里提供的static_check的源码嘛。那个是成品。
[/Quote]
loki是这样的:
    template<int> struct CompileTimeError;
template<> struct CompileTimeError<true> {};
#define LOKI_STATIC_CHECK(expr, msg) \
{ Loki::CompileTimeError<((expr) != 0)> ERROR_##msg; (void)ERROR_##msg; }

这个是OK的,不过,我还是用5楼的方法吧,看起来出错信息更好看一点:)
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 taodm 的回复:]
模板上的技巧,几乎一切都是不可移植的。

[/Quote]http://generalstone.spaces.live.com/blog/cns!eefa1eaf2d6ff0cf!124.entry
fallening 2009-04-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 hairetz 的回复:]
$ g++ -o check check.cc -Wall

check.cpp吧?.cc是啥东东?
[/Quote]
呵呵,习惯问题,其实gcc都是认的,无论.cpp、.cc、.cxx还是.C
fallening 2009-04-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 liliangbao 的回复:]
C/C++ code(void)sizeof(CompileTimeChecker<((expr)!=0)>((ERROR_##msg())));
修改为:
CompileTimeChecker<((expr)!=0)>((ERROR_##msg()));
[/Quote]
this works, thx.
taodm 2009-04-28
  • 打赏
  • 举报
回复
你可以看一下loki源码包里提供的static_check的源码嘛。那个是成品。
  • 打赏
  • 举报
回复
$ g++ -o check check.cc -Wall

check.cpp吧?.cc是啥东东?
fallening 2009-04-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 taodm 的回复:]
模板上的技巧,几乎一切都是不可移植的。

[/Quote]
呃,有没有可能做下修改,使得gcc可以产生这个错误信息(Error: Cannot convert ERROR_one_is_two to CompileTimeChecker <false>)呢?
liliangbao 2009-04-28
  • 打赏
  • 举报
回复
(void)sizeof(CompileTimeChecker<((expr) != 0)>((ERROR_##msg())));
修改为:
CompileTimeChecker<((expr) != 0)>((ERROR_##msg()));
mengde007 2009-04-28
  • 打赏
  • 举报
回复
我一向都用VS;看来不能帮楼主了;
taodm 2009-04-28
  • 打赏
  • 举报
回复
模板上的技巧,几乎一切都是不可移植的。
liliangbao 2009-04-28
  • 打赏
  • 举报
回复
帮顶先~~~
jackyjkchen 2009-04-28
  • 打赏
  • 举报
回复
没用过gcc的路过

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧