我了解当选项struct B
{
// for example
int UglyName(std::string str, int i)
{ std::cout << str << " " << i << std::endl; return i + 1; }
};
struct C : B
{
template<typename ...Args>
auto PrettyName(Args&& ...args)
{ return UglyName(std::forward<Args>(args)...); }
};
int main()
{
C c;
std::cout << "return value: " << c.PrettyName("Test Message: ", 23) << std::endl;
return 0;
}
设置为mainCRTStartup
时,Visual C ++链接器会选择wmainCRTStartup
/ /SUBSYSTEM
。
我不明白的是链接器如何在两者之间选择。
我在VC 2015上使用一个简单的程序进行了测试。如果存在wmain(甚至main也存在),则调用wmain。否则主叫。
答案 0 :(得分:2)
链接器将尝试通过遍历objs的符号表来推断需要哪个入口点例程。它在_main之前搜索_wmain,这就是为什么前者被选中,即使你有两者。然后,链接器从默认的libc静态库中提取相应的启动例程。
您可以通过向链接器提供/ ENTRY,/ DEFAULTLIB和/ NODEFAULTLIB选项来覆盖其中的大部分内容。但通常,您让链接器自动处理此问题。
此外,您的程序中只应有一个主C函数。要么显式定义其中一个,要么转到TCHAR路由,让你的编译器用main()或wmain()替换_tmain(),具体取决于是否定义了UNICODE。