我收到一个奇怪的警告:
预定义类型"System.Runtime.CompilerServices.ExtensionAttribute"在全局别名中的多个程序集中定义; 使用'c:\ Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll'中的定义
没有给出行号,所以很难弄清楚它是什么.
编译器错误代码是CS1685
我的应用程序中有一些配置选项
const bool ExecuteThis=true;
const bool ExecuteThat=false;
Run Code Online (Sandbox Code Playgroud)
然后像使用它的代码
if(ExecuteThis){ DoThis(); }
if(ExecuteThat){ DoThat(); } //unreachable code warning here
Run Code Online (Sandbox Code Playgroud)
问题是,我们可能会制作略有不同的版本,而不是ExecuteThis或ExecuteThat,我们希望能够使用consts,这样我们就不会在运行时对这些事情进行任何速度惩罚.但我厌倦了看到关于无法访问的代码的警告.我是一个喜欢消除所有警告的人,但我对这些事情无能为力.我可以使用一些选项来关闭这些警告吗?
我有下面的课:
class Cdata12Mnt
{
public:
char IOBname[ID1_IOB_PIOTSUP-ID1_IOB_TOP][BOADNAM_MAX + 4];
char ExIOBname[ID1_MAX_INF-ID1_EXIOB_U1TOP][BOADNAM_MAX + 4];
char cflpath[256];
char basetext[256];
UINT database[ID1_MAX_INF];
int State;
public:
char SelectPath[256];
public:
int GetIOBName(int slt,char *Name);
Cdata12Mnt(char *SelectPath);
virtual ~Cdata12Mnt();
int GetValue(int id);
int GetState() { return State; }
};
Run Code Online (Sandbox Code Playgroud)
我的功能如下:
Cdata12Mnt::Cdata12Mnt(char *SelectPath)
{
SCTReg reg;
char buf[256], *cpnt, *npnt, *bpnt1, *bpnt2;
char *startcode[] = {"CNTL_CODE ","SEGMENT "};
char *stopcode = {"END_CNTL_CODE "};
FILE *fp;
int ii, infl;
State = 0;
for (ii = 0; ii < …Run Code Online (Sandbox Code Playgroud) 我在堆栈变量上收到此警告:
warning: object.member may be used uninitialized in this function
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我不希望强制初始化只是为了消除警告,因为它消耗CPU周期.变量是POD结构,所以memset它不是零成本.我可以验证变量从未使用过未初始化,所以我只想禁止它的警告.
一般来说,我确实需要警告,而不是在这个特定情况下的特定变量.我怎么能抑制警告?
看起来pragma诊断是正确的方法,但它们需要相当新版本的GCC(4.6)
在该版本之前,没有可接受的解决方案.
我正在玩可选参数,看看它们如何与接口配合使用,我遇到了一个奇怪的警告.我的设置是以下代码:
public interface ITestInterface
{
void TestOptional(int a = 5, int b = 10, object c = null);
}
public class TestClass : ITestInterface
{
void ITestInterface.TestOptional(int a = 5, int b = 5, object c = null)
{
Console.Write("a=" + a + " b=" + b + " c=" + c);
}
}
Run Code Online (Sandbox Code Playgroud)
编译器给了我以下警告:
如果我使用以下代码运行它:
class Program
{
static void Main(string[] args)
{
ITestInterface test = new TestClass();
test.TestOptional();
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
a=5 b=10 c=正如我所料,我得到了" …
我将facebook SDK合并到一个更新中,我得到四个文件的编译器警告,在我的一个目标中,每个文件都有两个这样的警告.
[WARN]警告:没有规则处理架构armv7类型sourcecode.ch的'$(PROJECT_DIR)/ APP_NAME /Facebook.h'文件
[WARN]警告:没有规则处理架构armv6类型sourcecode.ch的'$(PROJECT_DIR)/ APP_NAME /Facebook.h' 文件
在另一个目标中,每个文件只生成一个警告,
[WARN]警告:没有规则处理架构i386类型sourcecode.ch的'$(PROJECT_DIR)/ APP_NAME /FBConnect.h' 文件
在facebook SDK的文档中,他们告诉我将i386添加到构建设置中的有效架构,但他们没有说任何关于任何"构建规则"的事情,奇怪的是我已经将相同的facebook SDK合并到另一个应用程序中而没有单一问题.我能看到的唯一区别是这个项目已经有两个目标,而且(每个)这些警告只来自其中一个.任何人都可以告诉我如何为这四个文件制定构建规则吗?我需要armv6和armv7和i386的构建规则吗?
除了不同的-info.plist和不同的.pch文件外,构建设置完全相同.我应该补充说,facebook功能在模拟器上工作正常,但在使用任一构建目标的任何测试设备中都没有.
非常感谢.
对于这个简化的测试用例:
#include <map>
class Tester {
int foo;
std::map<int, int> smap;
};
int main() {
Tester test;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到以下编译器警告:
$ clang++ -std=c++98 -Weverything test.cc
test.cc:5:24: warning: padding class 'Tester' with 4 bytes to align 'smap' [-Wpadded]
std::map<int, int> smap;
^
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释这个警告意味着什么,以及我应该如何解决它?
我已更新Xcode到7.3,现在我对用于创建随机字符串的函数发出警告.
我试图改变for声明, for (i in 0 ..< len){...}但是警告变成了错误.
如何删除警告?
static func randomStringWithLength (len : Int) -> NSString {
let letters : NSString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
let randomString : NSMutableString = NSMutableString(capacity: len)
for (var i=0; i < len; i += 1){ // warning
let length = UInt32 (letters.length)
let rand = arc4random_uniform(length)
randomString.appendFormat("%C", letters.characterAtIndex(Int(rand)))
}
return randomString
}
Run Code Online (Sandbox Code Playgroud) 经常使用的语句(void)x;允许禁止有关未使用变量的警告x.但是如果我尝试编译以下内容,我会得到一些我不太了解的结果:
int main()
{
int x;
(short)x;
(void)x;
(int)x;
}
Run Code Online (Sandbox Code Playgroud)
用g ++编译它,我得到以下警告:
$ g++ test.cpp -Wall -Wextra -o test
test.cpp: In function ‘int main()’:
test.cpp:4:13: warning: statement has no effect [-Wunused-value]
(short)x;
^
test.cpp:6:11: warning: statement has no effect [-Wunused-value]
(int)x;
^
Run Code Online (Sandbox Code Playgroud)
因此,我得出结论,转换为void与任何其他类型的转换非常不同,是目标类型相同decltype(x)或不同的东西.我猜测可能的解释是:
(void)x;但其他演员不会抑制警告.所有陈述同样没有任何效果.void x;并非如此short x;.哪一项更正确?如果没有,那么如何解释编译器警告的差异?
我花了很长时间才发现我的代码中有一个错误被触发/OPT:ICF:
因为/ OPT:ICF可以将相同的地址分配给不同的函数或只读数据成员(使用/ Gy编译的const变量),它可以破坏依赖于函数或只读数据成员的唯一地址的程序.
(我一直在存储和比较函数指针的相等性,当链接器丢弃相同的函数时会断开这些指针.)
现在我需要找到我可能做过这样事情的每一个地方.
测试用例当然是微不足道的:
//MSVC: /Gy /link /OPT:ICF
int test1(void) { return 0; }
int test2(void) { return 0; }
int main(void) { return test1 == test2; }
Run Code Online (Sandbox Code Playgroud)
我试过-Wall,-Wextra,-Weverything,-pedantic,等,但他们没有产生警告.
是否有任何编译器选项或工具(无论是Visual C++,GCC,Clang还是其他部分)可以分析我的代码并告诉我在哪里比较函数指针,就像在上面的代码中一样?