【问题标题】:How to convert this C code to C++?如何将此 C 代码转换为 C++?
【发布时间】:2014-08-24 22:28:25
【问题描述】:

我有一些这样声明的数组:

static double covalent_radius[256] = {
    [ 0 ] = 0.85,
    [ 1 ] = 0.37,
    ...
};

C++ 不允许这种声明。有什么方法可以实现吗?

【问题讨论】:

  • 不。 (十宽度空间)
  • 十宽度空间是为了让你评论@Rapptz?如果是这样,你可以回答这个问题,如果你愿意。
  • 等等,这还是C吗?
  • @E_net4,C99,是的。关于这个问题,最好只创建一个std::array,然后填写您想要不同的特定元素,但是您可以创建一个采用索引值对并使用一些魔法的函数初始化整个数组。
  • 好吧,从 C++ 的角度来看,我确实发现语法很奇怪。

标签: c++ c arrays c++11


【解决方案1】:
static double covalent_radius[256] = {
    0.85, /* ?,  Unknown    */
    0.37, /* H,  Hydrogen   */
    ...
};

它是 C89,而不是 C99,所以我想它应该可以工作。

【讨论】:

  • “它是 C89,而不是 C99,所以我想它应该可以工作。” - 不太相关,OP 要求使用 C++,而不是 C。
  • @TheParamagneticCroissant:C++ 是从 C89 派生出来的,所以有很大的相关性(但代码也是有效的 C++)
  • @MSalters 什么是“C++”?它是标准的 C++ 吗? C++98? C++03? C++11? C++14? C++17? C++ 的当前和之前的标准(分别为 C++14 和 C++11)以 C99 作为规范起点。因此,用 C89 编写的代码编译为 C++ 的机会并不比 C99 代码好很多。
  • @TheParamagneticCroissant:指定初始值设定项(在本例中)、复合文字和 VLA 在 C99 中可用,但在 C++ 中不可用。
  • @TheParamagneticCroissant:嗯,在 C++ 从 C 派生出来的时候,还没有 C++ 标准,所以它必然是标准前的 C++。 ISO 14882:1998 正式确定了分叉,但专门针对图书馆这样做。核心语言是重新规范。 C++11 和 C++14 确实使用 C99 作为规范起点,但同样不引用核心语言。
【解决方案2】:

你为什么不这样做:

static double covalent_radius[256] = {
    0.85, /* 0: ?,  Unknown    */
    0.37, /* 1: H,  Hydrogen   */
    ...
};

【讨论】:

    【解决方案3】:

    您可以使用两个std::stringdouble 中的std::vector 中的std::vectordouble

    #include <iostream>
    #include <string>
    #include <tuple>
    #include <vector>
    
    static auto periodic_table = std::vector<std::tuple<std::string, std::string, double>> 
    {
        std::make_tuple("?", "Unknown", 0.85),
        std::make_tuple("H", "Hydrogen", 0.37)
    };
    
    std::string element_symbol(int neutrons)
    {
        return std::get<0>(periodic_table[neutrons]);    
    }
    
    std::string element_name(int neutrons)
    {
        return std::get<1>(periodic_table[neutrons]);    
    }
    
    double covalent_radius(int neutrons)
    {
        return std::get<2>(periodic_table[neutrons]);    
    }
    
    int main() 
    {
        std::cout << element_symbol(1) << "\n";
        std::cout << element_name(1) << "\n";
        std::cout << covalent_radius(1) << "\n";
    }
    

    Live Example(使用 C++11 初始化列表)。

    注意:我会制作元素周期表 std::vector 而不是数组,因为它们会不断合成新的(不稳定的)元素。

    【讨论】:

    • 现实世界中很少有可以用整数正确描述的对象,但元素是——只是原子核中的质子数。这比名称或符号更明智。 (您可以通过条目 [0] 看到这一点,它可能应该是 'n', "neutron")。
    猜你喜欢
    • 2019-09-29
    • 2011-12-08
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    • 2021-12-24
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多