模板与特立独行的VS

本文探讨了C++模板在不同编译器下的编译行为,特别是在VS与g++中的表现差异,分析了模板何时开始进行语法检查及编译器处理模板的具体时机。

双十一前夕买的书到了,其中一本便是C++ Templates,书比较老了但依旧经典,周末的时候翻看了下,感觉挺好。今天在等待代码编译时,突发脑袋里面蹦出了一个疑问,虽然C++标准有规定,模板会被进行两次三阶段的编译,但是什么时候开始对模板进行编译呢(当我把博客写了一半之后发现C++ Templates一书中明确提到了实例化之前就进行语法检查,于是开始继续研究VS到底有多特立独行)?

于是我写下了下面的代码。

template <typename T>
void Test(T a)
{
	T c 
}

int main(int argc, char **argv)
{
	return 0;
}

在VS中编译,顺利通过,就连一个警告都没有。

加上调用之后

template <typename T>
void Test(T a)
{
	T c 
}

int main(int argc, char **argv)
{
	int a = 0;
	Test(a);
	return 0;
}
VS开始报错,于是我得出了一个结论,函数模板会在实例化时才会被编译器处理,幸好,当我在将这个结论写在书上之后我又试了试g++。在g++中第一种写法的时候就开始报错。那么g++应该是在遇到模板本身的时候就开始对模板进行语法检查。但是这样的话,如果模板所在的文件被多个文件包含,那岂不是得进行很多次语法检查?VS的处理方式这时候看起来好像就更为妥当????

其实也不是,想象这样一个场景,在你使用VS时,你的模板所在的文件被很多文件包含,你突然想给之前定义的模板加点东西。加完之后开始编译。编译器正常的对所有包含了模板所在文件的文件进行重新编译(头文件被预处理器展开之后导致所有包含了该头文件的文件被改变),编译了一段时间之后终于编译到了实例化模板的文件,编译器开始处理模板,但是接下来却不顺利了,编译器报错了。你在之前更改模板的时候不小心引入了错误。。。。。。你又必须再次更改模板,所有包含了模板所在文件的文件又必须再次编译一遍。。。。。。。。如果用的是g++是不是就可以提早发现错误呢?(也许??反正测试效果蛮好的也不会出现下面的问题)

(此时发现C++ Templates明确提出)实例化之前就进行语法检查

继续看VS的特立独行

现在将代码改成这样

template <typename T>
void Test(T a)
{
	asdadadadadadadadadadadadadadadadasd   
}

int main(int argc, char **argv)
{
	int a = 0;
	Test();
	return 0;
}

现在模板被调用了。VS总该去处理模板了吧,按照标准,应该先编译模板本身进行语法检查。但是你会发现它报的错误却是error c2780 "void Test(T)"应输入1个参数,却提供了0个。根据标准这是第二阶段的编译。。。。。

继续

template <typename T>
void Test(T a)
{
	asdadadadadadadadadadadadadadadadasd   
}

int main(int argc, char **argv)
{
	int a = 0;
	Test( a );
	return 0;
}


这个时候VS才标准规定的报语法错误, error c2065 与 error c2143 








【博士论文复现】【阻抗建模、验证扫频法】光伏并网逆变器扫频稳定性(包含锁相环电流环)(Simulink仿真实现)内容概要:本文档是一份关于“光伏并网逆变器扫频稳定性析”的Simulink仿真实现资源,重点复现博士论文中的阻抗建模扫频法验证过程,涵盖锁相环和电流环等关键控制环节。通过构建详细的逆变器模型,采用小信号扰动方法进行频域扫描,获取系统输出阻抗特性,并结合奈奎斯特稳定判据析并网系统的稳定性,帮助深入理解光伏发电系统在弱电网条件下的动态行为失稳机理。; 适合人群:具备电力电子、自动控制理论基础,熟悉Simulink仿真环境,从事新能源发电、微电网或电力系统稳定性研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握光伏并网逆变器的阻抗建模方法;②学习基于扫频法的系统稳定性析流程;③复现高水平学术论文中的关键技术环节,支撑科研项目或学位论文工作;④为实际工程中并网逆变器的稳定性问题提供仿真析手段。; 阅读建议:建议读者结合相关理论教材原始论文,逐步运行并调试提供的Simulink模型,重点关注锁相环电流控制器参数对系统阻抗特性的影响,通过改变电网强度等条件观察系统稳定性变化,深化对阻抗析法的理解应用能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值