我有一个简单的C++与Boost像这样:
#include <boost/algorithm/string.hpp>
int main()
{
std::string latlonStr = "hello,ergr()()rg(rg)";
boost::find_format_all(latlonStr,boost::token_finder(boost::is_any_of("(,)")),boost::const_formatter(" "));
Run Code Online (Sandbox Code Playgroud)
这很好用; 它取代了每次出现的(),用""
但是,我在编译时收到此警告:
我正在使用MSVC 2008,Boost 1.37.0.
1>Compiling...
1>mainTest.cpp
1>c:\work\minescout-feat-000\extlib\boost\algorithm\string\detail\classification.hpp(102) : warning C4996: 'std::copy': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'
1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\xutility(2576) : see declaration of 'std::copy'
1> c:\work\minescout-feat-000\extlib\boost\algorithm\string\classification.hpp(206) : see …Run Code Online (Sandbox Code Playgroud) 所以,(看似)突然之间,我的项目开始得到编译器警告1685:
预定义类型"System.Runtime.CompilerServices.ExtensionAttribute"在全局别名中的多个程序集中定义; 使用'c:\ Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll'中的定义
困惑,我研究了MSDN文章,找出其原因.这是我发现的信息:
Visual C#参考:错误和警告编译器警告(级别1)CS1685
错误消息预定义类型"System.type name"在全局别名中的多个程序集中定义; 使用'文件名'中的定义
在两个程序集中找到预定义的系统类型(如System.int32)时,会发生此错误.这种情况的一种方法是,如果您从两个不同的位置引用mscorlib,例如尝试并行运行.Net Framework版本1.0和1.1.
编译器将仅使用其中一个程序集中的定义.编译器仅搜索全局别名,不搜索库定义/引用.如果已指定/ nostdlib,则编译器将搜索Object,并在将来启动所有搜索到找到Object的文件中的预定义类型.
现在我真的在挠头.
我没有运行两个不同版本的.NET Framework(除非你算上2.0和3.5).
我没有引用可能让我怀疑的任何奇怪的集会.
我不记得对我的应用程序进行任何更改会刺激这种变化.
我已经验证所有组件都针对.NET Framework版本v2.0.50727.
我愿意接受有关如何纠正此问题的建议或想法.我将警告视为错误,这让我发疯.
真正让我烦恼的是,我不知道它为什么会发生.发生的事情应该有一个可辨别的原因,我应该知道它们为什么会发生.如果我无法解释,我无法准确地解决它.猜测工作永远不会令人满意.
该应用程序很简单,由类库和Windows窗体应用程序组成.
AC#类库DLL提供封装数据库访问的基本功能.此DLL引用以下组件:
提供UI的AC#Windows Forms应用程序.此应用程序引用以下组件:
如果您需要更多信息,请告诉我,我很乐意提供.
由于本答案中描述的原因,我经常在我的#defines中使用do-while(0)构造.此外,我正在尝试使用尽可能高的编译器警告级别来捕获更多潜在问题,并使我的代码更加健壮和跨平台.所以我通常使用-Wallgcc和/WallMSVC.
不幸的是,MSVC抱怨do-while(0)构造:
foo.c(36) : warning C4127: conditional expression is constant
Run Code Online (Sandbox Code Playgroud)
我应该怎么做这个警告?
只是为所有文件全局禁用它?对我来说这似乎不是一个好主意.
从msdn我得到这个:
#pragma warning disable warning-list
#pragma warning restore warning-list
Run Code Online (Sandbox Code Playgroud)
在示例中,使用了disable和restore.restore如果我想要为整个文件禁用它,是否有必要?
就像,如果我不恢复,它携带多远?之后编译的所有内容都禁用警告吗?或者仅仅是该文件的其余部分?还是被忽略了?
在开始使用一些VS2005生成的MFC代码时,我注意到它覆盖了一个类似这样的方法:
void OnDraw(CDC* /*pDC*/)
{
...
// TODO: Add your code here
}
Run Code Online (Sandbox Code Playgroud)
所以,当然,只要我补上一我意识到我需要以编译取消注释在PDC正式的说法,但我很困惑,如何/为什么在C++函数可以编译(无警告)何时正式参数只有一个类型,而不是一个名称:
void foo(int)
{
int x = 3;
}
int main()
{
foo(5);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这不应该产生至少一个警告(使用-Wall或/ W4)?它似乎没有.我错过了什么吗?是否有这种情况有用,或者只是因为编译器无法区分函数声明(只需要类型)和定义(完全指定)之间的区别,直到处理完行后?
我想使用一些旧的gcc版本中没有的gcc警告开关(例如-Wtype-limits).
是否有一种简单的方法来检查gcc版本,如果使用最近的gcc,只添加那些额外的选项?
当我尝试编译下面的代码时,我收到此警告:
warning: suggest parentheses around assignment used as truth value
为什么会这样?我相信这是一个相当普遍的习语.我甚至在我的代码中使用了类似的东西.
struct PIDList*
getRecordForPID(struct PIDList* list, pid_t pid) {
while(list = list->next)
if (list->pid == pid)
return list;
return NULL;
}
Run Code Online (Sandbox Code Playgroud) 我是Android新手,我正在使用该Ical4j库来解析ICS(Outlook日历)文件.
但是,当我在Eclipse中构建应用程序时,控制台中会多次出现以下警告:
[2010-07-22 15:58:31 - Google日历上传]警告:忽略没有关联的EnclosingMethod属性的匿名内部类的InnerClasses属性.(这个类可能是由一个破碎的编译器产生的.)
这有什么影响?我该如何解决这个问题?
C风格的宏名称是否与标识符具有相同的命名规则?在编译器升级之后,它现在为遗留应用程序发出此警告:
warning #3649-D: white space is required between the macro name "CHAR_" and its replacement text
#define CHAR_& 38
Run Code Online (Sandbox Code Playgroud)
这行代码定义了&符号的ASCII值常量.
#define DOL_SN 36
#define PERCENT 37
#define CHAR_& 38
#define RT_SING 39
#define LF_PAR 40
Run Code Online (Sandbox Code Playgroud)
我假设这个定义(实际上没有被任何代码引用,据我所知)是错误的,应该改为像"CHAR_AMPERSAND"这样的东西?