由一次奇怪的编译出错想起的

现象

最近在工作中遇到了一次奇怪的编译出错。事情是这样的,本来这个asp.net webform应用是可以编译的。但是将另外一个class library的工程加入到这个asp.net webform应用的引用中,还未改任何其它的代码。这个asp.net webform应用就出现了编译错误。分析这些编译出错的地方,再看了SVN历史,这些文件最近都没有改过(最近一次改动是六月的事情了),但是这些文件确实是编译有错。有点奇怪。一时想不出来为什么。等到第二天,继续分析,突然发现引起编译出错的类型是属于这个新加入引用的工程。看了编译出错的代码,其并没有引入任何新加入引用的工程任何名称空间。这就奇怪了。还没有引入其任何名称空间,只是把引用刚加上就出了编译出错。这个asp.net webform工程原来是可以编译的,为什么会加入一个引用后就不能编译了呢?会不会去掉引用还是能编译?于是试着去掉了这个新加的引用。编译。果然可以编译。之前出错的地方不再出错了。看了一下那些之前出错的类型,发现居然是另外一些在本来asp.net webform工程里的一些类,并不是新加工程里的类。而且这些类都有名称空间。这就奇怪了,为什么加入引用之后,这些类就变成了新加工程里的类呢?打开了新加工程里的类,仔细看了一下,发现了一个问题,即该类没有定义名称空间,同时该类的名字与asp.net webform工程里的类同名。这就是为什么这些没有名称空间的类会引起编译错误的原因了。当.net compiler定位一个类时,如果有两个类同名,一个类有名称空间,另一个没有。.net compiler优先搜索没有名称空间的类,然后再去搜索有名称空间的类。原来的程序引用的是有名称空间的类,没有加入新引用时一切都没有问题。当加入引用时,而且新的类没有名称空间,刚好可以把原来的有名称空间的类替换掉。.net compiler优先搜索到这个没有名称空间的类,从而引起原来的程序出错。因为原来有名称空间的类已经变了,换成这个没有名称空间的类。既然找到了原因,那么解决办法就简单了。

解决方案

原因已经清楚了。解决办法包括:

1. 给那些没有名称空间的类加上名称空间

    这个在实际情况中无法做到,这个新工程是由专人负责的。不能去改。

2. 给现有代码强行加上全名称空间+类名的引用方式

   这种办法技术上是可行,但是会引起代码看起来很恐怖。也不打算采用。

3. 实际的解决方式:

   给那位专人指出这个问题,然后去掉对新工程的引用。因为其引起已有工程编译出错。然后在已有工程里照搬了新工程里几个类,写了一些Mock up(假的实现)。等那位专人解决这个问题之后再进行合起来的编译。

 

时间: 2024-09-24 22:31:56

由一次奇怪的编译出错想起的的相关文章

xcode-学习objective-c 基础教程遇到问题 例题03.06 word-length-3 编译出错

问题描述 学习objective-c 基础教程遇到问题 例题03.06 word-length-3 编译出错 #import int main(int argc, const char * argv[]) { FILE *wordFile = fopen ("/tmp/words.txt", "r"); char word[100]; while (fgets(*word,99,wordFile)) \这一行编译出现"Thread 1:EXC_BAD_AC

chromium nacl编译出错

问题描述 chromium nacl编译出错 FAILED: Command '........outDebuggensdkwin_x86pnacl_newlibbinpnacl-ar @c:usersadmini~1.??appdatalocaltemptmpz8nl6n' returned non-zero exit stat us 1 [4/14478] ACTION nacl_lib_newlib: buil... plib_3ee1b6ebff4793d51aee0961182f8cb

JAVA代码编译出错:找不到符号,求解答

问题描述 JAVA代码编译出错:找不到符号,求解答 源代码: package com.tarena.shoot; import java.util.Random; //Airplane----敌机既是飞行物, public class Airplane extends FlyingObject implements Enemy{ private int speed = 2;//敌机走步的步数 public Airplane(){ image = ShootGame.airplane; width

java特殊符号的输入后编译出错

问题描述 java特殊符号的输入后编译出错 java编写代码每次到特殊符号如|都编译不出来 求大神教教我 解决方案 已自行解决 Java 双竖线按住shift加""""就行了 || 解决方案二: 在java中,||为或符号,为一种特殊字符,所以在字符串中需要在前面加上转义字符"".

如果子类的构造方法中既没有显示调用基类构造方法,而基类中又没有无参数的构造方法,则编译出错。

问题描述 如果子类的构造方法中既没有显示调用基类构造方法,而基类中又没有无参数的构造方法,则编译出错. class Person { private String name; private int age; public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public String getName(){ return name; } pu

openssl编译出错,真心快崩溃了。。。求解答

问题描述 openssl编译出错,真心快崩溃了...求解答 如题,小弟今天编译的openssl-0.9.8zg,在执行nmake -f msntdll.mak后,总是出现以下错误 -c .cryptoecec_asn1.c ec_asn1.c .cryptoecec_asn1.c(264) : error C2370: "ECPKPARAMETERS_it": 重定义:不同的 存储类 .cryptoecec_asn1.c(262) : 参见"ECPKPARAMETERS_it

mod tile-mod_tile编译出错 -std=c++11 or -std=gnu++11

问题描述 mod_tile编译出错 -std=c++11 or -std=gnu++11 make[1]: 正在进入目录 /home/wml/src/mod_tile-master' depbase=echo src/gen_tile.o | sed 's|[^/]*$|.deps/&|;s|.o$||'`; g++ -DHAVE_CONFIG_H -I. -I./includes -I/usr/include/freetype2 -pthread -I/usr/local/include -I

commit message带引号,clang 编译出错

问题描述 commit message带引号,clang 编译出错 使用git commit becf7bfd4d8b3d8858d0b94f779d1b690248c11a Author: tug tug@skyth-tek.com Date: Sat May 21 13:28:10 2016 +0800 "a test" 提交如上,提交名为 "a test " 编译时候就会报错: target thumb C++: libsurfaceflinger <=

c++ primer-C++ primer第五版例子编译出错

问题描述 C++ primer第五版例子编译出错 请教,中文第五版p190页的例子编译出错,不知道错哪里了,求大神指正,感激不尽. 错误提示:expected unqualified-id before ')' token 代码如下: include include using namespace std; string::size_type() find_char(const string &s, char c, string::size_type() &occurs) { auto r