散分200,庆祝发现 VC7 与 C++ 标准冲突,还是咱们的BCB好啊

CCED136 2005-07-28 09:15:00
// 冲突点:VC7 WIN32 工程中,全局类变量的构造函数和析构函数不会被执行
// 下面是测试代码

// 这是VC7 WIN32 控制台工程的主文件
// mainunit.cpp
#include <stdio.h>
#include <windows.h>

//----------------------------------------------------------------------
// 类定义
class TTcpClient
{
public:
TTcpClient();
~TTcpClient();
BOOL Open(VOID);
BOOL Close(VOID);
private:
SOCKET mSocket;
};

//----------------------------------------------------------------------
// 类实现

TTcpClient::TTcpClient()
{
mSocket = INVALID_SOCKET;
}

TTcpClient::~TTcpClient()
{
Close();
}

BOOL TTcpClient::Open(VOID)
{
if ( mSocket == INVALID_SOCKET )
{
return TRUE;
}

return FALSE;
}

BOOL TTcpClient::Close(VOID)
{
if ( mSocket != INVALID_SOCKET )
{
mSocket = INVALID_SOCKET;
}

return TRUE;
}

//----------------------------------------------------------------------
// 定义全局类变量
TTcpClient mClient;

//----------------------------------------------------------------------
// 程序主函数

int main()
{
if ( mClient.Open() )
{
printf("\nProcess OK");
}
else
{
printf("\nProcess Error");
}

printf("\n");
system("pause");
}
...全文
1318 130 打赏 收藏 转发到动态 举报
写回复
用AI写文章
130 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaonian_3654 2005-08-18
  • 打赏
  • 举报
回复
我没有收到你的email

我在我的第一贴已经说的很明白了

bcb用的CRT和vc用的crt是不一样的
入口点都是默认的函数,你要改成别的函数,全局变量当然没有初始化了
原理我说的够明白了,

你把你的sln贴上来,我也懒得看

上面有个网友说你处心积虑的改Entrypoint函数
你结果回人家一句,又发现一个VC的bug

faint,我不想同你争工具好坏,没那个口才,
我在上个单位的时候,同事经常由于自己的能力问题(他没有意识到),
错误设置,使程序同是联接MFC调试版和发布版,错误使用CRT库,造成运行错误。

你把EntryPoint改成别的函数, 堆都没有初始化,你看看传进main的参数!

说你傻你还别不服气

xiaonian_3654 2005-08-18
  • 打赏
  • 举报
回复
这样, 你在你心爱的BCB里面设置以下EntryPoint
看看有问题么?

crystal_heart 2005-08-18
  • 打赏
  • 举报
回复

============================================================================
NewProject.sln
============================================================================
Microsoft Visual Studio Solution File, Format Version 8.00
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NewProject", "NewProject.vcproj", "{D3722A21-BF5B-4760-BC22-B21D55547921}"
ProjectSection(ProjectDependencies) = postProject
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfiguration) = preSolution
Debug = Debug
Release = Release
EndGlobalSection
GlobalSection(ProjectConfiguration) = postSolution
{D3722A21-BF5B-4760-BC22-B21D55547921}.Debug.ActiveCfg = Debug|Win32
{D3722A21-BF5B-4760-BC22-B21D55547921}.Debug.Build.0 = Debug|Win32
{D3722A21-BF5B-4760-BC22-B21D55547921}.Release.ActiveCfg = Release|Win32
{D3722A21-BF5B-4760-BC22-B21D55547921}.Release.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
EndGlobalSection
GlobalSection(ExtensibilityAddIns) = postSolution
EndGlobalSection
EndGlobal

============================================================================
NewProject.vcproj
============================================================================
<?xml version="1.0" encoding="gb2312"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="7.10"
Name="NewProject"
ProjectGUID="{D3722A21-BF5B-4760-BC22-B21D55547921}"
Keyword="Win32Proj">
<Platforms>
<Platform
Name="Win32"/>
</Platforms>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="Debug"
IntermediateDirectory="Debug"
ConfigurationType="1"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
MinimalRebuild="TRUE"
BasicRuntimeChecks="3"
RuntimeLibrary="5"
UsePrecompiledHeader="3"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="4"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
OutputFile="$(OutDir)/NewProject.exe"
LinkIncremental="2"
GenerateDebugInformation="TRUE"
ProgramDatabaseFile="$(OutDir)/NewProject.pdb"
SubSystem="1"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="Release"
IntermediateDirectory="Release"
ConfigurationType="1"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
RuntimeLibrary="4"
UsePrecompiledHeader="3"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="3"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
OutputFile="$(OutDir)/NewProject.exe"
LinkIncremental="1"
GenerateDebugInformation="TRUE"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="源文件"
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
<File
RelativePath=".\NewProject.cpp">
</File>
<File
RelativePath=".\stdafx.cpp">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
UsePrecompiledHeader="1"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
UsePrecompiledHeader="1"/>
</FileConfiguration>
</File>
</Filter>
<Filter
Name="头文件"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
<File
RelativePath=".\stdafx.h">
</File>
</Filter>
<Filter
Name="资源文件"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
</Filter>
<File
RelativePath=".\ReadMe.txt">
</File>
</Files>
<Globals>
</Globals>
</VisualStudioProject>
============================================================================
stdafx.h
============================================================================
// stdafx.h : 标准系统包含文件的包含文件,
// 或是常用但不常更改的项目特定的包含文件
//

#pragma once


#include <iostream>
#include <tchar.h>

// TODO: 在此处引用程序要求的附加头文件
============================================================================
stdafx.cpp
============================================================================
// stdafx.cpp : 只包括标准包含文件的源文件
// NewProject.pch 将成为预编译头
// stdafx.obj 将包含预编译类型信息

#include "stdafx.h"

// TODO: 在 STDAFX.H 中
//引用任何所需的附加头文件,而不是在此文件中引用
============================================================================
stdafx.cpp
============================================================================
// NewProject.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
CCED136 2005-08-18
  • 打赏
  • 举报
回复
气难平,还想说几句。

再次 2 xiaonian_3654(你猜猜(我要打光棍,小乔嫁不了)) :

我不知道你是否就是现在教育[惨业化]培育出来的所谓高素质人才,

但是就你在本帖中的一言一行来看,我可以肯定地说,教育[惨业化]

已经彻底的失败了。

想想看,为了能够讨论顶楼的问题,你要我给你发邮件,当我一看到
你的回复就立即给你发了;你在帖子中提出什么问题,我在第一时间
马上给你回复了;在讨论问题过程中,你与其他兄弟产生了争论,我
立即劝你们消消气就事论事。

可是,最后呢,最后只换来一句“搂主你傻的没治了”
(注意:上句引用中,楼主的楼字还是错别字)

现在,我严肃的告诉你:我鄙视你
CCED136 2005-08-18
  • 打赏
  • 举报
回复
2 xiaonian_3654(你猜猜(我要打光棍,小乔嫁不了)) :

可能是我智商低,我还是没有明白像你这样的高人的思想。
难道你已经解决了顶楼的问题???!!! 高人啊!!!!!

把你的分析方法和研究结果拿出来,让我们这些菜鸟瞻仰瞻仰。

不懂就是不懂,我从来不会不懂装懂,也不会自己懂了然后就
去鄙视曾经和我一样不懂的人。虽然直到现在我仍然没有明白
顶楼的问题,但是我要鄙视你,即使你真的搞明白了顶楼的问题。

xiaonian_3654 2005-08-18
  • 打赏
  • 举报
回复
搂主你傻的没治了
CCED136 2005-08-18
  • 打赏
  • 举报
回复
2 ALL:

简单修改我的测试代码,就可以正确输出信息:

将我测试代码中的 INT WINAPI Main(VOID) 替换为 int main(),
然后在工程配置信息中,取消指定的工程进入点 Main 就可以了。
最后,编译并执行,一切 ok 。


CCED136 2005-08-18
  • 打赏
  • 举报
回复
2 crystal_heart(笑看风云):

我原来还以为你说的是,“EntryPoint无法起作用,或者说存在问题。”,
我不同意你的观点,是因为我指定了 EntryPoint 为 Main 后,
Main 函数确实可以执行的哈。现在我明白了,你说的EntryPoint问题,正是
造成顶楼问题的原因,看来 EntryPoint 要慎用了。

但是,直到现在我仍然不会同意你说我是“处心积虑”搞东搞西。出现顶楼的
问题一直令我困惑不解,我确实是不知道为什么,你怎么能够说我是“处心积虑”呢?

对于你的帮助,我将单独开贴 200 分给你,注意查收哈,再次谢谢你的帮助。



2 xiaonian_3654(你猜猜(我要打光棍,小乔嫁不了)):

我仍然鄙视你,你在本贴中,为解决顶楼的问题你贡献了什么?
我只看到你在这里炫耀你如何如何的了不起,叫大家“眼睛睁大点”,
仔细看你在这里的意气风发,藐视众生的表演。

我承认,我确实不知道为什么会出现顶楼的问题,虽然现在我知道了,
对某个事情不懂,或者对某个问题不知道答案,
难道就是你说的“傻的没治了”,看来,你应该已经达到了
“天上的知道一半,地上的全知道了”这样的境界了,
如果爱因斯坦在世的话,我相信他在你面前也不敢抬起头来。
对你曾有的帮助,我已经没有任何感谢的想法了,
剩下的只有:鄙视你




2 ALL:

再次总结一下,顶楼的问题看来应该再次修正了,虽然不知道这是不是 VC7.1 的
BUG ,但从今天开始,所有的兄弟姐妹都应该注意避免这个问题了,描述如下:
(权且称为使用 VC7.1 的注意事项好了)

VC7.1 的控制台工程中,指定非默认工程进入点函数名称,有可能导致全局类变量的
构造函数不会被执行。

CCED136 2005-08-18
  • 打赏
  • 举报
回复
2 crystal_heart(笑看风云):

哈哈,看了你最近的回复,经过测试,顶楼的问题应该是我在工程中
重定义 工程入口点 造成的,可能是我没有明白到你前面指出的
“ EntryPoint 的问题”所代表的意思。我收回我说的话:
//----------------------------------------------------------------------------
最后2 crystal_heart(笑看风云) :
我最后想说的是,我要反驳你的缪论:
“处心积虑,你的代码最多只能说明VC7.1中,LINK的EntryPoint无法起作用,或者说存在问题。”

难道你已经测试出来了在我公布的测试代码工程中,“LINK的EntryPoint无法起作用,或者说存在问题”,我可是重来没有发现这个问题,并且在我的工程中,Main 函数(指定的控制台工程进入点)一直都是工作正常的。

如果你能够明确的证明“VC7.1中,LINK的EntryPoint无法起作用,或者说存在问题”,那么我要恭喜你,因为你又发现了一个 VC7.1 的 BUG(至少是在某种环境下出现的 BUG)。
//----------------------------------------------------------------------------
xiaonian_3654 2005-08-18
  • 打赏
  • 举报
回复
说到我水平高低,高我不敢说
char main[] = "\xc3";
这样的代码我还是会写的!
CCED136 2005-08-17
  • 打赏
  • 举报
回复
2 crystal_heart(笑看风云) :

仔细看了你的回复,我仍然没有明白你到底想说明什么。我已经开始怀疑你是否是真的在力图重现顶楼的问题,以及测试和分析形成该问题的原因,甚至推出解决(或者说回避)该问题的方法方案。

再次2 crystal_heart(笑看风云) :

我不知道你是否是真正的 C/C++ 高手,但是我想我有必要向你解释一下你所指出的这部分代码的作用和功能,虽然我不是一个真正的 C/C++ 高手。

1、子系统问题:
在 VS2003 中建立控制台工程,默认情况下,VC71 建立的工程项目类型是“应用程序(.exe)”,并且在连接选项配置中的命令行项目上,指定了连接类型为“_CONSOLE”,表明了目标程序为控制台类型。
在我公布的测试代码工程中,并没有在工程配置信息中指定“_CONSOLE”类型,而是在主程序代码中明确指定该标志,具体的语句为:#pragma comment(linker, "/subsystem:console"),所起到的作用和效果 与 在工程配置文件中指定是一样的。这有什么问题吗????


2、关闭编译警告问题:
无论是在 C++ 的范畴内,还是在具体的开发环境中,我不显示或者说关闭普通警告信息,这是很正常的行为,难道这也有什么问题吗???难道你测试后发现,就是因为我关闭了警告信息才导致出现顶楼的问题??难道下面的代码有什么我不知道的隐患和问题,请你告知:
#pragma warning(push, 4)
#pragma warning(disable:4204)
#pragma warning(disable:4100)


3、指定连接库问题:
代码:
#pragma comment(lib,"msvcrt.lib")
#pragma comment(lib,"kernel32.lib")

这里我明确指定了工程中需要连接到的动态连接库,其中包含了 MS 的运行时态库 msvcrt.DLL。应该说几乎所有的 MS.VC 的工程都使用到了这个库文件,难道你已经测试研究发现了正是因为我在这里使用了它,才导致了顶楼问题的出现??如果你认为这两句代码不顺眼,完全可以注释掉他们,但你要知道 MS 的连接器仍然会默认连接这两个库的,并且这两个 LIB 文件 MS.VC 开发环境自带 。


最后2 crystal_heart(笑看风云) :
我最后想说的是,我要反驳你的缪论:
“处心积虑,你的代码最多只能说明VC7.1中,LINK的EntryPoint无法起作用,或者说存在问题。”

难道你已经测试出来了在我公布的测试代码工程中,“LINK的EntryPoint无法起作用,或者说存在问题”,我可是重来没有发现这个问题,并且在我的工程中,Main 函数(指定的控制台工程进入点)一直都是工作正常的。

如果你能够明确的证明“VC7.1中,LINK的EntryPoint无法起作用,或者说存在问题”,那么我要恭喜你,因为你又发现了一个 VC7.1 的 BUG(至少是在某种环境下出现的 BUG)。

2 ALL:
大家继续发言哈,我还有 近 5000 分,分不够可以另外开贴给分哈
wangxian404 2005-08-17
  • 打赏
  • 举报
回复
up!
crystal_heart 2005-08-15
  • 打赏
  • 举报
回复

你的代码最多只能说明VC7.1中,LINK的EntryPoint无法起作用,或者说存在问题。


有问题的地方:

1、附加的依赖库:
.\Msvcrt.lib

2、TestBug.cpp中,关闭编译警告,并且手工指定连接库:
#pragma warning(push, 4)
#pragma warning(disable:4204)
#pragma warning(disable:4100)
#pragma comment(lib,"msvcrt.lib")
#pragma comment(lib,"kernel32.lib")

3、入口函数函数定义为Main(首字母大写,并非缺省的main),此处加上WINAPI说明?
EntryPointSymbol="Main"
--INT WINAPI Main(VOID)

4、不指定运行子系统
crystal_heart 2005-08-15
  • 打赏
  • 举报
回复
处心积虑

你的代码最多只能说明VC7.1中,LINK的EntryPoint无法起作用,或者说存在问题。


有问题的地方:

1、附加的依赖库:
.\Msvcrt.lib

2、TestBug.cpp中,关闭编译警告,并且手工指定连接库:
#pragma warning(push, 4)
#pragma warning(disable:4204)
#pragma warning(disable:4100)

#pragma comment(lib,"msvcrt.lib")
#pragma comment(lib,"kernel32.lib")

3、入口函数函数定义为Main(首字母大写,并非缺省的main),此处加上WINAPI说明?
EntryPointSymbol="Main"
--INT WINAPI Main(VOID)
crystal_heart 2005-08-15
  • 打赏
  • 举报
回复
正在链接...
LINK : fatal error LNK1181: 无法打开输入文件“.\Msvcrt.lib”
CCED136 2005-08-12
  • 打赏
  • 举报
回复
咋个没有人跟贴?
crystal_heart 2005-08-11
  • 打赏
  • 举报
回复
vcproj
dsp
dsw
crystal_heart 2005-08-11
  • 打赏
  • 举报
回复
你把工程文件都贴上来吧,也没有几行字。
futulove 2005-08-11
  • 打赏
  • 举报
回复
在6上也通过 了呀
xiaonian_3654 2005-08-11
  • 打赏
  • 举报
回复
ZZZZzzzz4@hotmail.com

#include "stdafx.h"是预编译用的,可以设置的
加载更多回复(110)

552

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 茶馆
社区管理员
  • 茶馆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧