Visual C++中可以编译警告但是会警告,怎么关闭这个警告啊?

  • 以前会经常用到此选项以便允許非标准代码在点的位置之后使用循环变量,根据标准规范这些变量本应该在范围之外。 仅当使用 /Za 选项进行编译警告时才需要因为没囿 /Za,将始终允许在循环结束后使用 for 循环变量 如果你不关心标准一致性(例如,如果你的代码不是为了移植到其他编译警告器)你可以關闭 /Za 选项(或将“禁用语言扩展”属性设置为“否”)。 如果你确实关心编写可移植且符合标准的代码则应重写代码,以便通过将此类變量的声明移到循环以外的点使其符合标准

  • /Zg 编译警告器选项(生成函数原型)不再可用。 此此编译警告器选项已被弃用

  • 在之前其正确編译警告的位置,不再允许存在 mutable 存储类说明符 现在,编译警告器报告错误 C2071(非法存储类) 根据标准,可变说明符仅可应用于类数据成員的名称不能应用于声明为 const 或 static 的名称,也不能应用于引用成员

    早期版本的 Visual C++ 编译警告器接受此代码,但现在编译警告器则报告以下错误:

    若要修复此错误只需删除冗余的可变关键字。

  • 若要更新你的代码请删除 typedef 声明,并重命名与这些名称发生冲突的任何其他标识符

  • 现茬会在提供显式模板参数时准确检查包含非类型模板参数的某些代码的类型符合性。 例如在早期版本的 Visual C++ 中正确编译警告的以下代码。

    当湔编译警告器可以准确报告错误因为模板参数类型不匹配模板参数(该参数是指向 const 成员的指针,但函数为非 const):

    备注:使用以下模板参數:

    若要在代码中修复此错误请确保你使用的模板参数类型匹配模板参数声明的类型。

  • 编译警告器不再接受函数上的 __declspec(align) 以前会始终忽略此项,但现在会产生编译警告器错误

    若要解决此问题,请从函数声明中删除 __declspec(align) 因为它不起作用,将其删除不会更改任何内容

  • 问题在于,复制构造函数是私有的因此对象无法像处理异常的标准过程那样进行复制。 当复制构造函数为声明的 explicit 时这同样适用。

    若要更新你的玳码请确保异常对象的复制构造函数是公用的且未标记为 explicit

    可以通过将 catch 的参数类型更改为引用来解决此问题

  • 编译警告器现在支持用户萣义的文本。 因此宏之前没有任何干预空格的字符串文本被视为用户定义的文本,这可能会产生错误或意外结果 例如,在早期的编译警告器中成功编译警告了以下代码:

    编译警告器将此视为后面是宏的字符串文本“hello”,该宏是展开的“there”然后两个字符串串联成一个。 在 Visual Studio 2015 中的 Visual C++ 中编译警告器将此视为用户定义的文字,但由于没有定义匹配的用户定义的 _x 文本它将报告错误。

    若要解决此问题请在字符串文本和宏之间添加一个空格。

  • 与上文类似由于字符串分析中的相关变化,没有任何空格的相邻字符串文本(或宽或窄的字符字符串文夲)被视为 Visaul C++ 早期版本中的单个串联字符串 在 Visual Studio 2015 中的 Visual C++ 中,现在必须在两个字符串之间添加空格 例如,必须更改以下代码:

    只需在两个字符串之间添加空间

  • 对 delete 运算符做出更改以使其符合 C++14 标准。 标准更改的详细信息位于  这些更改将添加采用大小参数的全局 delete 运算符的形式。 重夶更改为如果你之前使用的是具有相同签名的运算符 delete(以与 placement new 运算符对应),你将收到编译警告器错误(C2956在使用 placement new 的点位置出现,因为在玳码中的该位置编译警告器会尝试标识适当匹配的 delete

    调整了大小的释放,此 delete 函数现在是常用释放函数(全局 delete 运算符) 标准要求为,如果使用 placement new 查找相应的 delete 函数和常用释放函数则程序会出现格式错误。

    的调用以传递新类型(例如通过使用static_cast<my_type>从整数值转换)并更新 new 和 delete 的定义以強制转换回整数类型。 你无需为此使用枚举;具有 size_t 成员的类类型也将起作用

    你还可以将 placement new 全部消除作为备选解决方案。 如果你的代码使用 placement new 實现内存池其中位置参数是分配或删除的对象的大小,则调整了大小的释放功能可能适合替换你自定义的内存池代码且你可以去掉位置函数,仅使用自己两个参数的 delete 运算符(而不是位置参数)

    如果你不想立即更新代码,可以通过使用编译警告器选项 /Zc:sizedDealloc- 恢复到旧行为 如果使用此选项,则不存在两个参数的 delete 函数并且也不会导致与 placement delete 运算符发生冲突。

  • 前面的代码产生以下错误:

    若要解决此问题请将引用类型更改为指针或值。 更改指针类型需要对使用联合字段的代码进行更改 将代码更改为值将更改存储在联合中的数据,这会影响其他字段因为联合类型中的字段共享相同的内存。 根据值的大小它还可能更改联合的大小。

  • 匿名联合现在更符合标准 早期版本的编译警告器苼成了匿名联合的显式构造函数和析构函数。 这些在 Visual Studio 2015 中的 Visual C++ 中已删除

    若要解决此问题,请提供你对构造函数和/或析构函数的定义

  • 为了符匼标准,已正对联合中的匿名结构的成员更改了运行时行为 创建此类联合时,将不再隐式调用联合中的匿名结构成员的构造函数 此外,联合超出范围时不再隐式调用联合中的匿名结构成员的析构函数。 请考虑以下代码其中联合 U 包含一个匿名结构,此匿名结构包含的荿员是一个具有析构函数的命名结构

    警告 C4587:U::s:行为更改:不再隐式调用构造函数
    警告 C4588:U::s:行为更改:不再隐式调用析构函数

    若要还原原始荇为请赋予匿名结构一个名称。 无论编译警告器版本为何非匿名结构的运行时行为都是相同的。

    或者尝试将构造函数和析构函数代碼移到新的函数中,并从联合的构造函数和析构函数添加对这些函数的调用

  • 对模板的名称解析进行了更改。 在 C++ 中考虑名称解析的候选對象时,可能会出现作为潜在匹配项考虑的一个或多个名称生成无效的模板实例化的情况 这些无效的实例化通常不会导致编译警告器错誤,这被称为 SFINAE(替换失败不是错误)原则

    现在,如果 SFINAE 要求编译警告器将类模板专用化进行实例化则在此过程中发生的任何错误都是编譯警告器错误。 在早期版本中编译警告器会忽略此类错误。 例如考虑以下代码:

    如果使用当前编译警告器进行编译警告,将得到以下錯误:

    这是因为在第一次调用 is_base_of 时尚未定义类“D”。

    在这种情况下解决方法是在定义类之前,不使用此类类型特征 如果将 D 和 B 的定义移箌代码文件的开头,错误将得到解决 如果定义位于标头文件中,请检查标头文件的 include 语句的顺序以确保在使用有问题的模板之前,对任哬类定义进行了编译警告

  • 在 Visual Studio 2013 和 Visual Studio 2015 RC 中,如果该类具有用户定义的移动构造函数但没有用户定义的复制构造函数,则编译警告器生成类的复淛构造函数 在 Dev14 中,此隐式生成的复制构造函数也标记为“= delete”

是不是你安装的时候改变了默認路径?

这里有个别人总结的详细方法你可以试试(在重装之前):

“CL.exe”是VC使用真正的编译警告器(编译警告程序),其路径在“VC根目錄\VC98\Bin”下面

你可以到相应的路径下找到这个应用程序。

因此问题可以按照以下方法解决:打开vc界面 点击VC“TOOLS(工具)”—>“Option(选择)”

(例洳你的VC装在C但是这些路径全部在D),改过来就OK了

如果你是按照初始路径安装vc6.0的,路径应为:

如果你装在其他盘里则仿照其路径变通僦行(我就是装在D盘)。

这部分将帮助大家解释一些常见嘚错误、警告和问题帮助大家去理解和解决一些常见问题,并了解它的根本原因

下面的代码为什么在VC2010下面编译警告不过去?


造成这个錯误的原因在于历史原因在过去C++98标准尚未订立的时候,C++的标准输入输出流确实是定义在这个文件里面的这是C风格的定义方法,随着C++98标准的确定iostream.h已经被取消,至少在VC2010下面是这样的取而代之的是我们要用头文件来代替,你甚至可以认为是这样定义的:

因此我们可以简单嘚修改我们的Hello World

     iostream.h是属于C++的头文件,而非C的因此标准订立的时候被改成了。而C的头文件stdio.h等依然可以继续使用这是为了兼容C代码。但是它們依然有对应的C++版本如 等。记住在VC2010上面采用C++风格的头文件而不是C风格的头文件,除非你是在用C

这是一个警告,请看下面的代码:

    这昰因为VC2005版本开始微软引入了一系列的安全加强的函数来增强CRTC运行时),这里对应的是strcpy_s_s意为safe的意思,同样的道理strcat也是同样。因此偠解决这个问题我们可以用strcpy_s来替换strcpy,但是注意strcpy_s并非所有编译警告器都提供因此如果要跨编译警告器,请采用错误信息中所提示的方式定义_CRT_SECURE_NO_WARNINGS宏来掩耳盗铃吧。另外注意并非所有的加强函数都是在屁股后面加_s比如stricmp这个字符串比较函数的增强版名字是_stricmp。下面用strcpy_s来更改程序:

    注意,strcpy_s有两个版本一个可以帮助我们自动推断缓冲区的大小,而另外一个不能帮助我们推断因此在编译警告器不能推断缓冲区大尛的时候,我们需要自己指定缓冲区的大小如上面的程序所演示的那样,关于增强版的函数请参考我写的《深入学习C++

     貌似没什么问题吧错了,如果你是按照我教你的方法创建的控制台空工程的话那么会有编译警告错误:

     这个问题太普遍了,几乎所有的初学者都会遇到洏且感到难以应付因为按照提示使用(LPCWSTR)强制转型貌似并不能帮助我们解决问题,而且这个程序在VC6下面应该是没有任何问题的那问题出现茬哪里呢?问题在这里请右键单击解决方案浏览器下面的项目,属性

      问题的根本就是字符集问题,在VC6中我们默认使用的是多字节字苻集,而现在我们默认需要的是UNICODE字符集简单的,我们把这个字符集改成多字节字符集这个问题就解决了:

      再试试应该就可以了吧但是峩并不推荐大家这么做,因为让自己的程序适应各种字符集是我们写代码的人义不容辞的义务

用两个宏TEXT或者_T都可以解决这个问题,它们兩个并没有太大区别也许区别在于前者是通过windows.h头文件引入的,而_T是通过tchar.h引入的我推荐大家使用_Ttchar.h,因为tchar.h还帮助我们引入了其它一些很囿用的宏比如_tcscpy_s,这个宏在使用UNICODE字符集的时候被替换成wcscpy_s在使用多字节字符集的使用被替换成strcpy_s。关于这部分的内容请大家不要错过《Windows核惢编程》的第二章(第四版或第五版都可以),以及《深入学习C++

     当然除非你运气好的抓狂,否则你是编译警告不过去的为什么呢?我们現在应该知道对于"Hello"这样的字符串VC2010会默认的将它视为const char*,即多字节字符串而L"Hello"前面有个L前缀的被视为UNICODE字符串,这和C#是有区别的因为C#的字符串总是被视为UNICODEC++/CLI下面编译警告器也会帮助我们做到这件事情所以它们不需要L(C++/CLI兼容L这种写法)。

因此我们可以了解到_T这样的宏只能处理直接的常量字符串不能处理其它的情况。而我们上面演示的那种情况需要我们动态的去转换编码WindowsAPI可以帮助我们做到,C库也有函数可以幫助我们恰好我曾经写过这样的代码,欢迎大家参考:ASCII/UNICODE/UTF8字符串互相转换的C++代码

## x而要绕个圈子去调用wxCONCAT_HELPER呢?这实际上涉及到宏展开顺序和截断的问题在这里,我们需要说一个宏参数的概念这很函数的参数是类似的,这里_T(x)x就是宏参数好,记住下面一句话:

     如果你定义嘚宏中使用了#或者是##的话宏参数将不会被展开,也就是说_T(x)如果直接定义成L##x那么在下面这种情况就会出错( PS: #是给参数加引号的意思):

让我們在项目里面再添加一个Test.h头文件方法是右击解决方案中的项目,添加新建项,C++头文件名称输入test.h。然后我们在test.h中输入:

     或许你会说伱引用(#include)了两次,我没你那么傻我只引用一次不就好了么?是的你聪明,但是是小聪明哈因为你不能保证每个人都不去引用它。

once的作鼡就在于防止头文件被多次引用你或许见过

    这样的代码,它们的作用是一样的如果你跟我一样懒,那么就用#pragma once如果你打算去没有这个指令的编译警告器上编译警告代码,那么还是用后面一种方式吧

如果说编译警告错误好找的话,链接错误对于初学者来说就有点麻烦了聪明的初学者会去Google、百度寻找答案,笨的初学者就会找所谓的高手、前辈问而这些高手Or前辈未必有心情为你解释。要解决这个错误有無数种方法

1、制作安装文件的过程中,一般会出现几个warning都是说某dll文件是系统自带的,不用加入安装包中之类的建议把这些dll从你生成嘚filesystem中删除,否则有可能遇到系统版本问题我遇到的相关具体问题是在win7下做的安装包到了xp下就无法安装和运行了。

2、关于快捷方式我采鼡的方法是(不知道算不算一种猥琐的方法):先将你编译警告好的Realse文件夹下面的exe文件添加到你的file system里。然后右键file system里添加好的exe文件会看到苼成快捷方式的选项。生成快捷方式后再将快捷方式剪切复制到user desktop等文件夹中去。

    3Logo自己画,或者找个bmpico文件的转换器吧不过转换完の后的效果都不怎么理想,毛刺挺多需要进一步修改。

4.最后添加进来的依赖dll有一个选项,选择selfregister的话是可以在安装时刻自动注册的叧外,不要忘了将注册时需要用到的dll也包含进来

5.默认安装路径等,在setup工程的property里都可以调整

VC++编程中,我随便选择了一个以前的程序准备编译警告结果报错。一开始怀疑我自己的问题于是写了一个最简单的程序,还是报错如下:

好奇下,决定用微软自己的用例跑跑于是新建了一个工程,并且选择Precompiled header生成的工程如图:

这时恍然大悟,原来是入口函数有问题正在做茅塞顿开状,一个学长提醒我到从VS2005,微软定义的入口函数就是_tmain了听了我还不相信,因为自己从来都是用mainVS2008中通过编译警告的后来在VS2008中生成工程,果然如学长所说囸在郁闷中,学长又提醒我可以设置工程的预编译警告项于是自己试了试,果然成功了在改了以后的设置中,VS2010也可以跑通了

方法如丅:*代表当前工程名



中怎么写个简单的C++程序?

vs2010中编写以上程序


cout写错了,同时还没有添加名字std(标准c++里是需要的vc6与标准不符,后来新版的vs嘟与标准一样了)

如今Visual C++处理方案和项目都运用MSBuild执行构建,从而取代了原来的构建工具VCBUILD.exe关于其他的Visual Studio言语和项目类型,MSBuild提供了一样的灵敏性可扩展性和基于XML的构建支持工具。为此Visual C++项目文件如今也运用了盛行的XML文件格式,并具有.vcxproj文件扩展名另外,从前期版本的Visual Studio中提供的項目文件将被自动转换为新的文件格式相关MSBuild工具的更多信息,请参见文章“MSBuild(Visual C++)

如今,VC++目录配置位于两个地点你可以运用项目属性页來配置每个项目对应的VC++目录,也可以够运用属性维护器和一个属性表来配置全局性的并且使每个配置值对应的VC++目录

VC++前期版本中,您可鉯定义存储在同一个处理方案中的项目之间的依托性如今在这些处理方案转换为新的项目文件格式后,相应的依托性也被转换为项目到項目的援用这种改变将会影响使用顺序,由于处理方案依托性和项目到项目的援用是不一样的

绝大非少数的/analyze(企业代码剖析)劝诫如今都鉯前被从CRTMFCATL库中移除

假设您的使用系统出现不测关闭或重新启动情况的话,重启维护器支持自动保管文件偏重新启动您的使用顺序仳如,当您的使用顺序由于自动更新而关闭时您可以运用重启维护器来再次启动这个使用顺序欲明白更多相关如何将使用顺序配置为运鼡启动维护器的信息,请参见《如何:添加剧启动维护支持》一文

新引入的CTaskDialog类可用于替代规范的AfxMessageBox音讯框。CTaskDialog类可以显示和搜集比规范的音訊框更多的信息

新引入的SafeInt库可以确保执行安全的算术运算,从而有效地防止了经常出现的整数溢出疑问这个库还支持比拟不一样类型嘚整数。

三、集成开发环境(IDE)

()改进的错误智能感知支持

Visual Studio 2010中集成开发环境(IDE)支持更好地检测能够招致丧失智能感知支持的错误,并在这些內容下面显示以红色波浪下划线此外,集成开发环境还支持把智能感知的错误输出到错误列表窗口中要想观察招致疑问的相关代码,伱只须要双击错误列表窗口中的错误即可

集成开发环境还支持#include主要字的自动完成。当您键入#include时集成开发环境将自动树立一个包括有效嘚头文件的下拉列表供您挑选。假设你继续输入一个文件名集成开发环境将自动依据您的输入加以过滤。在任什么时辰候你都可以依據这个列表来挑选你想要包括的文件。显然这一功用可以让您高速地包括那些尚不确切知晓文件名的文件。

如今auto主要字有了新的用途。你可以运用默许的auto主要字来声明一个变量的类型是从此变量声明的原始化表达式中推导出的而新的/Zc:auto编译警告器选项支持调用auto主要字的噺意义或以前的意义。

decltype操作符可以前往一个指定表达式的类型因而,你可以运用decltype操作符并结合运用auto主要字来声明一个庞杂类型或许是仅為编译警告器所知晓的类型比如,你可以运用这样的组合来声明一个模板函数而此模板函数的前往类型取决于其模板参数的类型。或許你还可以声明一个模板函数,而此模板函数调用另一个函数然后前往被调用函数的前往类型。

Lambda函数有一个函数体但没有函数名。Lambda函数把函数指针和函数对象两者的最好特征组合到了一同

你可以运用一个lambda函数来作为模板函数参数以替代一个函数对象,或许结合运用auto主要字来声明一个lambda类型的变量

右值rvalue援用声明符(&&)可以声明对一个右值rvalue的援用。右值援用可以使你运用静态语义(move

static_assert声明有助于在编译警告时测試软件中的断言这不一样于其他那些在运转时执行测试的断言机制。假设断言失败则编译警告失败并显示出指定的错误信息。

C++编译警告器准许您在本机代码或托管代码中运用nullptr主要字nullptr主要字用于指出一个对象句柄、内部指针或本地指针类型并不指向一个对象。当您运用/clr編译警告器选项时编译警告器将把nullptr解释为托管代码,而在不运用/clr选项时解释为本机代码

微软特定的__nullptr主要字与nullptr主要字意思类似,但它只適用于本机代码假设您运用/clr编译警告器选项编译警告本机C/C ++代码,那么编译警告器无法确定nullptr主要字是一个本地主要字照旧托管主要字为叻使编译警告器更清楚地了解你的意图,你可以运用nullptr主要字来指定现在操作为托管操作而运用__nullptr主要字来指定现在操作为本地操作。

默许凊况下三字符组(trigraphs)支持是被禁用的。在这种情况下你可以运用/Z?: trigraphs编译警告器选项来启用三字符组支持。

一个三字符组由两个延续的问号后媔跟着一个奇特的字符组成编译警告器可以运用相应的标点符号来取代这个三字符组。比如编译警告器可以运用#(数字符号)字符替代三芓符组??=。你还可以在C源文件中运用三字符组由于这些文件中运用的是不会包括某些标点字符的字符集。

()新的基于配置的优化选项

PogoSafeMode主要芓是一个新的基于配置的优化选项你可以运用PogoSafeMode主要字来指定你想运用安全方式照旧高速方式来优化您的使用顺序。留意安全方式是线程安全的,但它比高速方式慢一些高速方式是默许的优化行为。

新引入了一个通用言语运转时(CLR)选项/clr:nostdlib假设你的系统中包括了类似库的不┅样版本,那么编译警告器将显示错误提示这个新的选项可以使你扫除默许的CLR库,从而使你的顺序可以运用一个特定的版本

新引入的pragma指令detect_mismatch可以支持您运用类似的称号来替换您的文件中的某个特定的标志(相关于其他的标志)。假设类似的称号拥有多个值衔接器会发出错误提示。

ATL控件向导不再自动填充ProgID字段假设一个ATL控件没有一个ProgID,那么其他工具能够无法运用这个控件这样的一个工具的例子是“Insert Active Control”对话框。相关此对话框的更多信息请参考文章“插入ActiveX控件对话框”。

Visual Studio 2010中重新引入了MFC类向导如今,您可以在处理方案的任何地点调用类向导MFC类向导准许您添加类、音讯和变量,而不用手动修正单个的代码文件

新引入的YMMWord数据类型支持AVX(英特尔高级矢量扩展)指令中包括的256位的多媒体操作数。

C++是微软公司开发的一个IDE(集成开发环境),换句话说,就是运用c++的一个开发平台.有些软件就是这个编出来的...另外尚有VB,VF.只是运用不一样訁语...

但是,VC++Windows平台上的C++编程环境学习VC要明白许多Windows平台的特征并且还要掌握MFCATLCOM等的知识,难度比拟大Windows下编程须要明白Windows的音讯机制以及回調(callback)函数的原理;MFCWin32API的包装类,须要了解文档视图类的结构窗口类的结构,音讯流向等等;COM是代码共享的二进制规范须要掌握其基本原理等等。

加载中请稍候......

我要回帖

更多关于 编译警告 的文章

 

随机推荐