外部" C"常量值在.cpp中是未知的,但在.c中有效

时间:2016-10-04 09:48:40

标签: c++ keil

在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或其他编译器中吗?

1 个答案:

答案 0 :(得分:4)

C支持可变长度数组(自C99以来,但仅在C11之后可选。一些早期的编译器支持它们作为语言扩展),因此当时不需要知道C_VAL的值f2.c已编译,因此没有问题。

C ++不支持可变长度数组(除了一些编译器支持它们作为语言扩展),因此在编译C_VAL时必须知道f2.cpp的值。由于它只是声明,它的值是未知的,这就是编译器显示引用错误的原因。在将f2.cppf1.c的目标文件链接在一起之前,该值仍然未知。

解决方案:使用支持VLA的语言(例如C99),或支持VLA作为扩展的编译器(请参阅编译器的手册,无论是否支持它,以及如何启用支持)或定义数组具有编译时已知的长度。