My C++

COm

请看清楚了作者写的文件名是test_lua.c
如果你保存为cpp文件了,关于lua相关头文件应该使用:
extern "C"{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
否则编译会提示你的那种问题
char *text=GetString();
char *tmp=(char *)malloc(sizeof(char) * strlen(text));

I think u should change to
char *text=GetString();
char *tmp=(char *)malloc(sizeof(char) * (strlen(text) + sizeof(char)));
从不留言,这次谢谢啦!
re: 最简单的堆栈溢出demo tommy 2007-04-25 19:46
要看到效果必须把VC编译选项 /GZ去掉。
这是编译时逻辑,不是运行时逻辑。
enum { exists = sizeof(Test(MakeT())) == sizeof(Small) };
编译器根据程序中的代码调用状况,决定应该如何编译template相关的代码,
在编译时刻Conversion<T, U>::exists的值就计算出来了,
首先,sizeof(Small) 等于 1,
如果T就是U,或者T可以转换成U类型(这个就是关键),那么 Test(T) 就是Test(U),sizeof就等于sizeof(Small),恒等,意思是

Conversion<T,T>::exists一定是true,类型总是可以转换成自己。
如果T不是U,并且T不能转换成U类型,那么static Big Test(...)会被编译器“调用”(权且用这个词,编译原理只学了半桶水,不能装懂)

,因而exists就是false了(sizeof(Big)!=sizeof(Small),因为2!=1)。
之所以用MakeT这个函数,如作者所说,是为了满足当 T 只有私有构造函数的情况,编译器会在编译时检查语言的封装逻辑是否被违反,如果

存在违反情况将出现编译错误,MakeT这个函数就是为了绕过这个检查而设的,
我的理解是:用于运行时的代码中也没有“调用”这个函数,因而MakeT没有函数体也不会引起连接错误,就是编译通过了。
<2026年6月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

导航

统计

常用链接

留言簿

搜索

最新评论