在C档案中
@Override
public void onResume() {
super.onResume();
storedfavoritesitem = FavoriteModel.getAllFavorites();
if (adapter!=null && currentLocation!=null) {
mResualt.clear();
for (int i = 0; i < storedfavoritesitem.size(); i++) {
FavoriteModel Faveitem = storedfavoritesitem.get(i);
String locality = Faveitem.name;
int id = Faveitem.id;
double lat = Faveitem.lat;
double lon = Faveitem.lon;
Location location = new Location("Beach");
location.setLatitude(lat);
location.setLongitude(lon);
float distance = currentLocation.distanceTo(location);
mResualt.add(new SearchResualtClass(id, distance / 1000, locality));
}
adapter.notifyDataSetChanged();
}
}
}
在C ++文件中,我声明了简单的数组
// f1.c
const uint8_t C_VAL=2;`
构建输出:
// f2.cpp extern "C" const uint8_t C_VAL; char charray[C_VAL];
在.C
中链接extern时没有任何错误#259: constant value is not known
工作正常。
似乎问题在于联系。有可能解决,怎么样?这个问题只出现在MDK-ARM或其他编译器中吗?
答案 0 :(得分:4)
C支持可变长度数组(自C99以来,但仅在C11之后可选。一些早期的编译器支持它们作为语言扩展),因此当时不需要知道C_VAL
的值f2.c
已编译,因此没有问题。
C ++不支持可变长度数组(除了一些编译器支持它们作为语言扩展),因此在编译C_VAL
时必须知道f2.cpp
的值。由于它只是声明,它的值是未知的,这就是编译器显示引用错误的原因。在将f2.cpp
和f1.c
的目标文件链接在一起之前,该值仍然未知。
解决方案:使用支持VLA的语言(例如C99),或支持VLA作为扩展的编译器(请参阅编译器的手册,无论是否支持它,以及如何启用支持)或定义数组具有编译时已知的长度。