gcc 静态编译 static出错.求助.static

2016年10月优秀大版主2016年8月优秀大版主
2016年9月 总版技术专家分月排行榜第二
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。单片机时钟程序编译出错,求大神指点为什么出错? - 单片机/MCU论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
单片机时钟程序编译出错,求大神指点为什么出错?
等待验证会员
16:50:50  
本帖最后由 lettersprite 于
16:50 编辑
//本程序只是不求精确的时钟程序,使用的是金沙滩工作室学习板
#include &reg52.h&sbit ADDR0 = P1^0;sbit ADDR1 = P1^1;sbit ADDR2 = P1^2;sbit ADDR3 = P1^3;sbit ENLED = P1^4;unsigned char code image[] ={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,& & & & & & & & & & & & & & & & & & & & & & & & & & 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};char ge,shi,bai,qian,wan,shiwan,char fen=25;char xiaoshi=15;//static unsigned int shu=0;//static unsigned char i=0;void main(){& & EA = 1;& && & //使能总中断& & ENLED = 0;& & //使能U4,选择LED点阵& & ADDR3 = 1;& & TMOD = 0x01;&&//设置T0为模式1& & TH0&&= 0xFC;&&//为T0赋初值0xFC67,定时1ms& & TL0&&= 0x67;& & ET0&&= 1;& &&&//使能T0中断& & TR0&&= 1;& &&&//启动T0& & & & while (1)& & & & {& & & & ge=sec%10;& & & & shi=sec/10%10;& & & & bai=fen%10;& & & & qian=fen/10%10;& & & & wan=xiaoshi%10;& & & & shiwan=xiaoshi/10%10;& & & & & & & & }}/* 定时器0中断服务函数 */void InterruptTimer0() interrupt 1{& & TH0&&= 0xFC;&&//为T0赋初值0xFC67,定时1ms& & TL0&&= 0x67;& & & & static unsigned int shu=0;//定时计数& & & & static unsigned char i=0;//数码管片选//这两个静态变量放在主程序前,程序能正常编译,但是放这里就出错,为什么?有什么问题吗?求大神指点。& & & & if(shu==1000){shu=0;sec++;}& & & & if(sec==60){sec=0;fen++;}& & & & if(fen==60){fen=0;xiaoshi++;}& & & & if(xiaoshi==24){xiaoshi=0;}& & & & shu++;& & & & switch (i)& & & & {& & & & case 0:ADDR0=0;ADDR1=0;ADDR2=0;P0=image[ge];i++;& & & & case 1:ADDR0=1;ADDR1=0;ADDR2=0;P0=image[shi];i++;& & & & case 2:ADDR0=0;ADDR1=1;ADDR2=0;P0=image[bai];i++;& & & & case 3:ADDR0=1;ADDR1=1;ADDR2=0;P0=image[qian];i++;& & & & case 4:ADDR0=0;ADDR1=0;ADDR2=1;P0=image[wan];i++;& & & & case 5:ADDR0=1;ADDR1=0;ADDR2=1;P0=image[shiwan];i=0;& & & & default:& & & & }& & & & }
错误提示:Build target 'Target 1'assembling STARTUP.A51...compiling lianxi.c...LIANXI.C(39): error C141: syntax error near 'static'LIANXI.C(39): error C202: 'shu': undefined identifierLIANXI.C(40): error C141: syntax error near 'static'LIANXI.C(40): error C202: 'i': undefined identifierLIANXI.C(41): error C202: 'shu': undefined identifierLIANXI.C(41): error C202: 'shu': undefined identifierLIANXI.C(45): error C202: 'shu': undefined identifierLIANXI.C(46): error C202: 'i': undefined identifierLIANXI.C(48): error C202: 'i': undefined identifierLIANXI.C(49): error C202: 'i': undefined identifierLIANXI.C(50): error C202: 'i': undefined identifierLIANXI.C(51): error C202: 'i': undefined identifierLIANXI.C(52): error C202: 'i': undefined identifierLIANXI.C(53): error C202: 'i': undefined identifierTarget not created
16:48 上传
点击文件名下载附件
下载积分: 积分 -1 分
2.3 KB, 下载次数: 0, 下载积分: 积分 -1 分
17:23:36  
语法错误啊,那个 i啊shu啊没定义啊
18:00:35  
PCB在线计价下单
板子大小:
板子数量:
PCB 在线计价
变量的位置若在所有函数之外的就是全局的,在函数之内的就是局部的
助理工程师
18:33:28  
static关键字是C, C++中都存在的关键字, 它主要有三种使用方式, 其中前两种只指在C语言中使用, 第三种在C++中使用(C,C++中具体细微操作不尽相同, 本文以C++为准).
(1)局部静态变量
(2)外部静态变量/函数
(3)静态数据成员/成员函数
下面就这三种使用方式及注意事项分别说明
一、局部静态变量
在C/C++中, 局部变量按照存储形式可分为三种auto, static, register
( 谭浩强, 第174-175页)
与auto类型(普通)局部变量相比, static局部变量有三点不同
1. 存储空间分配不同
auto类型分配在栈上, 属于动态存储类别, 占动态存储区空间, 函数调用结束后自动释放, 而static分配在静态存储区, 在程序整个运行期间都不释放. 两者之间的作用域相同, 但生存期不同.
2. static局部变量在所处模块在初次运行时进行初始化工作, 且只操作一次
3. 对于局部静态变量, 如果不赋初值, 编译期会自动赋初值0或空字符, 而auto类型的初值是不确定的. (对于C++中的class对象例外, class的对象实例如果不初始化, 则会自动调用默认构造函数, 不管是否是static类型)
特点: static局部变量的”记忆性”与生存期的”全局性”
所谓”记忆性”是指在两次函数调用时, 在第二次调用进入时, 能保持第一次调用退出时的值.
示例程序一
void staticLocalVar()
static int a = 0; // 运行期时初始化一次, 下次再调用时, 不进行初始化工作
cout&&&a=&&&&&++a;
int main()
staticLocalVar(); // 第一次调用, 输出a=0
staticLocalVar(); // 第二次调用, 记忆了第一次退出时的值, 输出a=1
利用”记忆性”, 记录函数调用的次数(示例程序一)
& &利用生存期的”全局性”, 改善”return a pointer / reference to a local object”的问题. Local object的问题在于退出函数, 生存期即结束,. 利用static的作用, 延长变量的生存期.
示例程序二:
// IP address to string format
// Used in Ethernet Frame and IP Header analysis
const char * IpToStr(UINT32 IpAddr)
static char strBuff[16]; // static局部变量, 用于返回地址有效
const unsigned char *pChIP = (const unsigned char *)&IpA
sprintf(strBuff, &%u.%u.%u.%u&,&&pChIP[0], pChIP[1], pChIP[2], pChIP[3]);
return strB
1. “记忆性”, 程序运行很重要的一点就是可重复性, 而static变量的”记忆性”破坏了这种可重复性, 造成不同时刻至运行的结果可能不同.
2. “生存期”全局性和唯一性. 普通的local变量的存储空间分配在stack上, 因此每次调用函数时, 分配的空间都可能不一样, 而static具有全局唯一性的特点, 每次调用时, 都指向同一块内存, 这就造成一个很重要的问题 ---- 不可重入性!!!
这样在多线程程序设计或递归程序设计中, 要特别注意这个问题.
(不可重入性的例子可以参见 (影印版)第103-105页)
下面针对示例程序二, 分析在多线程情况下的不安全性.(为方便描述, 标上行号)
① const char * IpToStr(UINT32 IpAddr)
③&&static char strBuff[16]; // static局部变量, 用于返回地址有效
④&&const unsigned char *pChIP = (const unsigned char *)&IpA
⑤&&sprintf(strBuff, &%u.%u.%u.%u&,&&pChIP[0], pChIP[1], pChIP[2], pChIP[3]);
⑥&&return strB
假设现在有两个线程A,B运行期间都需要调用IpToStr()函数, 将32位的IP地址转换成点分10进制的字符串形式. 现A先获得执行机会, 执行IpToStr(), 传入的参数是0x0B090A0A, 顺序执行完应该返回的指针存储区内容是:”10.10.9.11”, 现执行到⑥时, 失去执行权, 调度到B线程执行, B线程传入的参数是0xA8A8A8C0, 执行至⑦, 静态存储区的内容是192.168.168.168. 当再调度到A执行时, 从⑥继续执行, 由于strBuff的全局唯一性, 内容已经被B线程冲掉, 此时返回的将是192.168.168.168字符串, 不再是10.10.9.11字符串.
二、外部静态变量/函数
在C中static有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。, 但为了限制全局变量/函数的作用域, 函数或变量前加static使得函数成为静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。注意此时, 对于外部(全局)变量, 不论是否有static限制, 它的存储区域都是在静态存储区, 生存期都是全局的. 此时的static只是起作用域限制作用, 限定作用域在本模块(文件)内部.
使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。
示例程序三:
//file1.cpp
static int varA;
extern void funA()
static void funB()
//file2.cpp
extern int varB; // 使用file1.cpp中定义的全局变量
extern int varA; // 错误! varA是static类型, 无法在其他文件中使用
extern vod funA(); // 使用file1.cpp中定义的函数
extern void funB(); // 错误! 无法使用file1.cpp文件中static函数
三、静态数据成员/成员函数(C++特有)
C++重用了这个关键字,并赋予它与前面不同的第三种含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数. 这是与普通成员函数的最大区别, 也是其应用所在, 比如在对某一个类的对象进行计数时, 计数生成多少个类的实例, 就可以用到静态数据成员. 在这里面, static既不是限定作用域的, 也不是扩展生存期的作用, 而是指示变量/函数在此类中的唯一性. 这也是”属于一个类而不是属于此类的任何特定对象的变量和函数”的含义. 因为它是对整个类来说是唯一的, 因此不可能属于某一个实例对象的. (针对静态数据成员而言, 成员函数不管是否是static, 在内存中只有一个副本, 普通成员函数调用时, 需要传入this指针, static成员函数调用时, 没有this指针. )
请看示例程序四( (影印版)第59页)
class EnemyTarget {
&&EnemyTarget() { ++numT }
&&EnemyTarget(const EnemyTarget&) { ++numT }
&&~EnemyTarget() { --numT }
&&static size_t numberOfTargets() { return numT }
&&bool destroy();& &// returns success of attempt to destroy EnemyTarget object
&&static size_t numT& && && && && &// object counter
// class statics must be defin
// initialization is to 0 by default
size_t EnemyTarget::numT
在这个例子中, 静态数据成员numTargets就是用来计数产生的对象个数的.
另外, 在设计类的多线程操作时, 由于POSIX库下的线程函数pthread_create()要求是全局的, 普通成员函数无法直接做为线程函数, 可以考虑用Static成员函数做线程函数.
高级工程师
18:55:38  
三楼好专业的感脚
助理工程师
20:12:07  
语法错误啊,定义寄存器的位置不对啊,
(40.86 KB, 下载次数: 0)
20:10 上传
18:06:51  
三楼啥意思啊,粘过来干嘛
18:07:22  
搞得好高端的样子,一句话不就说完了
等待验证会员
22:18:43  
谢谢楼主分享!!!学习学习
等待验证会员
11:26:48  
语法错误啊,定义寄存器的位置不对啊,
十分感谢!验证通过,我从来都没有考虑过这个问题,以前都是在使用前定义就好了,请问下还有哪些情况是要有特殊位置的呢?是不是所有的的定义都应该在进入函数就马上定义呢?
等待验证会员
11:28:53  
语法错误啊,那个 i啊shu啊没定义啊
不是没有定义,是定义的位置不对,谢谢#6楼!
等待验证会员
11:29:28  
变量的位置若在所有函数之外的就是全局的,在函数之内的就是局部的
谢谢回答,谢谢#6楼!
等待验证会员
11:30:56  
本帖最后由 lettersprite 于
11:38 编辑
搞得好高端的样子,一句话不就说完了
谢谢,可能他没仔细看问题。呵呵!
等待验证会员
11:35:49  
static关键字是C, C++中都存在的关键字, 它主要有三种使用方式, 其中前两种只指在C语言中使用, 第三种在C++中使用(C,C++中具体细微操作不尽相同, 本文以C++为准).
(1)局部静态变量
(2)外部静态变量/函数
多谢指导,
助理工程师
12:15:13  
多谢指导,
希望对你有帮助吧
Powered by
供应链服务
商务及广告合作
Jeffery Guo
关注我们的微信
供应链服务 PCB/IC/PCBA
下载发烧友APP
版权所有 (C) 深圳华强聚丰电子科技有限公司查看:3266|回复:1
root@longjiang-32 ~]# cd cmake-2.8.7[root@longjiang-32 cmake-2.8.7]# ./configure
---------------------------------------------
g++&&-I/root/cmake-2.8.7/Bootstrap.cmk -I/root/cmake-2.8.7/Source& &-I/root/cmake-2.8.7/Bootstrap.cmk -c /root/cmake-2.8.7/Source/cmStandardIncludes.cxx -o cmStandardIncludes.o
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_tree.h: In constructor ‘std::_Rb_tree&_Key, _Val, _KeyOfValue, _Compare, _Alloc&::_Rb_tree_impl&_Key_compare, _Is_pod_comparator&::_Rb_tree_impl(const typename _Alloc::rebind&std::_Rb_tree_node&_Val& &::other&, const _Key_compare&)’:
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_tree.h:412: error: expected `;'
gmake: *** [cmStandardIncludes.o] Error 1
---------------------------------------------
Error when bootstrapping CMake:
Problem while running gmake
---------------------------------------------
Log of errors: /root/cmake-2.8.7/Bootstrap.cmk/cmake_bootstrap.log
Log of errors: /root/cmake-2.8.7/Bootstrap.cmk/cmake_bootstrap.log
错误有日志记录,你看下日志里有什么导致错误的,可能是你编译工具安装不全查看: 2959|回复: 2
静态编译出错了 。求解决 ,json_static.lib
阅读权限140
结帖率: (5/16)
on_static.lib(JSON.obj) : error LNK2001: unresolved external symbol &int __stdcall NotifySys(int,unsigned long,unsigned long)& (?NotifySys@@YGHHKK@Z)
json_static.lib(cwinhttp.obj) : error LNK2001: unresolved external symbol &int __stdcall NotifySys(int,unsigned long,unsigned long)& (?NotifySys@@YGHHKK@Z)
json_static.lib(JSON.obj) : error LNK2001: unresolved external symbol &char * __cdecl CloneTextData(char *,int)& (?CloneTextData@@YAPADPADH@Z)
json_static.lib(JSON.obj) : error LNK2001: unresolved external symbol &char * __cdecl CloneTextData(char *)& (?CloneTextData@@YAPADPAD@Z)
json_static.lib(JSON.obj) : error LNK2001: unresolved external symbol &unsigned char * __cdecl CloneBinData(unsigned char *,int)& (?CloneBinData@@YAPAEPAEH@Z)复制代码json_static.lib 这个库我有静态版的。可不知道为什么还出这个错误 。求高手指点 。。。
回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至
可获得加分喔。友情提醒:本版被采纳的主题可在
帖子申请荣誉值,获得 1点 荣誉值,荣誉值可兑换终身vip用户组哦。快捷通道: →
阅读权限20
结帖率: (2/3)
库有问题,再去找能用的库。
您可以选择打赏方式支持他
阅读权限165
结帖率: (1/2)
这个支持库不支持静态编译,所以也没有静态编译所需要的文件
您可以选择打赏方式支持他
精易论坛 - 有你更精彩 /1
史上最强!!
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
揭阳精易科技有限公司申明:我公司所有的培训课程版权归精易所有,任何人以任何方式翻录、盗版、破解本站培训课程,我们必将通过法律途径解决!
公司简介:揭阳市揭东区精易科技有限公司致力于易语言教学培训/易语言学习交流社区的建设与软件开发,多年来为中小企业编写过许许多多各式软件,并把多年积累的开发经验逐步录制成视频课程供学员学习,让学员全面系统化学习易语言编程,少走弯路,减少对相关技术的研究与摸索时间,从而加快了学习进度!
防范网络诈骗,远离网络犯罪
违法和不良信息举报电话,QQ: ,,邮箱:@
Powered by
粤公网安备 25C++0x中引入了static_assert这个关键字,用来做编译期间的断言,因此叫做静态断言。
其语法很简单:static_assert(常量表达式,提示字符串)。
如果第一个参数常量表达式的值为真(true或者非零值),那么static_assert不做任何事情,就像它不存在一样,否则会产生一条编译错误,错误位置就是该static_assert语句所在行,错误提示就是第二个参数提示字符串。
使用static_assert,我们可以在编译期间发现更多的错误,用编译器来强制保证一些契约,并帮助我们改善编译信息的可读性,尤其是用于模板的时候。
static_assert可以用在全局作用域中,命名空间中,类作用域中,函数作用域中,几乎可以不受限制的使用。
编译器在遇到一个static_assert语句时,通常立刻将其第一个参数作为常量表达式进行演算,但如果该常量表达式依赖于某些模板参数,则延迟到模板实例化时再进行演算,这就让检查模板参数成为了可能。
由于之前有望加入C++0x标准的concepts提案最终被否决了,因此对于检查模板参数是否符合期望的重任,就要靠static_assert来完成了,所以如何构造适当的常量表达式,将是一个值得探讨的话题。
性能方面,由于是static_assert编译期间断言,不生成目标代码,因此static_assert不会造成任何运行期性能损失。
下面是一个来自MSDN的简单范例:
static_assert(sizeof(void *) == 4, "64-bit code generation is not supported.");
该static_assert用来确保编译仅在32位的平台上进行,不支持64位的平台,该语句可以放在文件的开头处,这样可以尽早检查,以节省失败情况下的编译时间。
再看另一个范例:
1: struct MyClass
6: struct MyEmptyClass
void func();
11: // 确保MyEmptyClass是一个空类(没有任何非静态成员变量,也没有虚函数)
12: static_assert(std::is_empty&MyEmptyClass&::value, "empty class needed");
14: //确保MyClass是一个非空类
15: static_assert(!std::is_empty&MyClass&::value, "non-empty class needed");
17: template &typename T, typename U, typename V&
18: class MyTemplate
// 确保模板参数T是一个非空类
static_assert(
!std::is_empty&T&::value,
"T should be n non-empty class"
// 确保模板参数U是一个空类
static_assert(
std::is_empty&U&::value,
"U should be an empty class"
// 确保模板参数V是从std::allocator&T&直接或间接派生而来,
// 或者V就是std::allocator&T&
static_assert(
std::is_base_of&std::allocator&T&, V&::value,
"V should inherit from std::allocator&T&"
41: // 仅当模板实例化时,MyTemplate里面的那三个static_assert才会真正被演算,
42: // 藉此检查模板参数是否符合期望
43: template class MyTemplate&MyClass, MyEmptyClass, std::allocator&MyClass&&;
通过这个例子我们可以看出来,static_assert可以很灵活的使用,通过构造适当的常量表达式,我们可以检查很多东西。比如范例中std::is_empty和std::is_base_of都是C++新的标准库提供的type traits模板,我们使用这些模板可以检查很多类型信息。
我们知道,C++现有的标准中,就有assert、#error两个设施,也是用来检查错误的,还有一些第三方的静态断言实现。
assert是运行期断言,它用来发现运行期间的错误,不能提前到编译期发现错误,也不具有强制性,也谈不上改善编译信息的可读性,既然是运行期检查,对性能当然是有影响的,所以经常在发行版本中,assert都会被关掉;
#error可看做预编译期断言,甚至都算不上断言,仅仅能在预编译时显示一个错误信息,它能做的不多,可以参与预编译的条件检查,由于它无法获得编译信息,当然就做不了更进一步分析了。
那么,在stastic_assert提交到C++0x标准之前,为了弥补assert和#error的不足,出现了一些第三方解决方案,可以作编译期的静态检查,例如BOOST_STATIC_ASSERT和LOKI_STATIC_CHECK,但由于它们都是利用了一些编译器的隐晦特性实现的trick,可移植性、简便性都不是太好,还会降低编译速度,而且功能也不够完善,例如BOOST_STATIC_ASSERT就不能定义错误提示文字,而LOKI_STATIC_CHECK则要求提示文字满足C++类型定义的语法。
编译器实现
gcc和vc的实现没有太大的差别,均不支持中文提示,非常遗憾,而且VC仅支持ASCII编码,L前缀就会编译出错。GCC好像可以支持其他编码,例如L前缀和U前缀,但我试过发现结果和ASCII编码一样。
static_assert的错误提示,VC比GCC稍微友好一些,VC对上下文和调用堆栈都有较清晰描述,相比之下,GCC的提示简陋一些,但也算比较明确吧,本来么,static_assert很大程度上就是为了编译器的提示信息更加友好而存在的。
最后再举个例子,用来判断某个类是否有某个指定名字的成员,供参考和体验。其实static_assert的应该很大程度上就是看如何构造常量表达式了,这个例子中使用了decltype关键字(也是C++0x新特性)和SFINAE技巧,以及一些编译器相关的技巧(主要是解决VC编译器的bug),具体的技术细节和原理在今后的文章中还会仔细探讨。
1: // 判断类是否含有foo这个成员变量和成员函数
2: // 针对GCC的实现,基本上就是针对标准C++的实现
3: #ifdef __GNUC__
5: // check_property_foo函数的两个重载版本,结合decltype,
6: // 通过SFINAE在编译期推导指定类型是否含有foo这个成员变量
7: char check_property_foo(...);
9: template &typename T&
10: void* check_property_foo(T const& t, decltype(&(t.foo)) p = 0);
12: // 这个类模板通过check_property_foo得出T是否含有foo这个成员变量
13: template &typename T&
14: struct has_property_foo : public std::integral_constant&
bool, sizeof(check_property_foo(*static_cast(0))) == sizeof(void*)&
19: // check_method_foo函数的两个重载版本,结合decltype,
20: // 通过SFINAE在编译期推导指定类型是否含有foo这个成员函数
21: char check_method_foo(...);
23: template &typename T&
24: void* check_method_foo(T const& t, decltype(&(T::foo)) p = 0);
26: // 这个类模板通过check_method_foo得出T是否含有foo这个成员函数
27: template &typename T&
28: struct has_method_foo
: public std::integral_constant&
bool, !has_property_foo::value &&
sizeof(check_method_foo(*static_cast(0))) == sizeof(void*)&
33: #endif
35: // 针对VC的实现,由于VC编译器在处理decltype和SFINAE情况下存在bug,
36: // 我们只能采用一些花招来绕过这个bug
37: #ifdef _MSC_VER
39: // check_member_foo函数的两个重载版本,结合decltype,
40: // 通过SFINAE在编译期推导指定类型是否含有foo这个成员变量或函数
41: char check_member_foo(...);
43: template &typename T&
44: auto check_member_foo(T const& t, decltype(&(t.foo)) p = 0)-&decltype(p);
46: // 这个类模板通过check_member_foo得出T是否含有foo这个成员变量
47: template &typename T&
48: struct has_property_foo
static const bool value =
sizeof(check_member_foo(*static_cast(0))) != sizeof(char) &&
std::is_pointerstatic_cast(0)))&::
55:&// 这个类模板通过check_member_foo得出T是否含有foo这个成员函数
56: template &typename T&
57: struct has_method_foo
static const bool value =
sizeof(check_member_foo(*static_cast(0))) != sizeof(char) &&
!std::is_pointerstatic_cast(0)))&::
64: #endif
66: // 先定义几个类供实现检测
67: struct WithPropertyFoo
72: struct WithMethodFoo
void foo();
77: struct WithRefPorpertyFoo
82: struct WithoutFoo
void bar();
87: // 用static_assert对这些条件进行检查
88: static_assert(has_property_foo::value, "property foo needed");
89: static_assert(has_method_foo::value, "method foo needed");
90: static_assert(!has_property_foo::value, "no property foo");
91: static_assert(!has_method_foo::value, "no methoed foo");
92: static_assert(has_property_foo::value, "property foo needed");
93: static_assert(!has_method_foo::value, "no method foo");
阅读(...) 评论()

我要回帖

更多关于 cmake编译opencv出错 的文章

 

随机推荐