extern "C"下默认参数为何可编译?VS2015 C++ DLL疑问
为什么extern "C"修饰的C++函数加默认参数还能正常编译?
这事儿其实得拆成两个核心点来理解,咱一步步说:
extern "C"管的是函数名,不是函数的语法特性
你可能以为extern "C"会把函数变成纯C语言函数,但其实它的作用只有一个:让C编译器按照C语言的命名修饰规则生成函数导出符号(比如不会给函数名加上参数类型相关的后缀,避免C重载带来的命名混乱)。但函数本身的定义和编译逻辑还是完全遵循C语法的——默认参数是C的原生特性,编译器自然会支持,编译时会帮你处理:当调用这个函数省略最后一个参数时,自动把NULL补进去,生成对应的调用代码。默认参数是编译期特性,不影响DLL的导出逻辑
给参数加默认值不会改变函数的实际参数个数和类型,只是编译器在调用阶段做的语法糖。你的DLL导出的函数符号还是C风格的,但函数本身依然是三个参数的C函数。VS2015作为标准的C编译器,完全能识别并处理这个默认参数,只要代码逻辑没问题,自然能顺利编译。这里要提个注意点:如果是用C语言代码调用这个DLL,那必须手动传全三个参数——因为C语言本身不支持默认参数,C编译器不会帮你补
NULL;但如果是C++代码调用,就可以直接省略最后一个参数,编译器会自动帮你补全。
内容的提问来源于stack exchange,提问作者Erik Šťastný
相关产品推荐
相关产品推荐

