1. ホーム
  2. c++

[解決済み] 非自明な指定イニシャライザはサポートされていません。

2022-02-10 10:51:36

質問

以下のような構造になっています。

struct app_data
{
    int port;
    int ib_port;
    unsigned size;
    int tx_depth;
    int sockfd;
    char *servername;
    struct ib_connection local_connection;
    struct ib_connection *remote_connection;
    struct ibv_device *ib_dev;

};

このように初期化しようとすると

struct app_data data =
{
    .port = 18515,
    .ib_port = 1,
    .size = 65536,
    .tx_depth = 100,
    .sockfd = -1,
    .servername = NULL,
    .remote_connection = NULL,
    .ib_dev = NULL
};

こんなエラーが出ます。

sorry, unimplemented: non-trivial designated initializers not supported

初期化の順番を宣言通りにしたいのだと思いますし local_connection が抜けています。でも、初期化する必要はないし、NULLに設定してもうまくいきません。

g++でこのように変更しても、まだ同じエラーが出ます。

struct app_data data =
{
    port : 18515,
    ib_port : 1,
    size : 65536,
    tx_depth : 100,
    sockfd : -1,
    servername : NULL,
    remote_connection : NULL,
    ib_dev : NULL
};

解決方法は?

g++では動作しません。あなたは本質的にCの構成要素をC++で使用しているのです。これを回避する方法がいくつかあります。

1) 初期化時に "." を削除し、 "=" を ":" に変更します。

#include <iostream>

using namespace std;
struct ib_connection
   {
    int x;
   };

   struct ibv_device
   {
   int y;
  };

struct app_data
{
    int port;
    int ib_port;
    unsigned size;
    int tx_depth;
    int sockfd;
    char *servername;
    struct ib_connection local_connection;
    struct ib_connection *remote_connection;
    struct ibv_device *ib_dev;

};

int main()
{

    struct app_data data =
    {
        port : 18515,
        ib_port : 1,
        size : 65536,
        tx_depth : 100,
        sockfd : -1,
        servername : NULL,

        local_connection : {5},
        remote_connection : NULL,
        ib_dev : NULL
    };

   cout << "Hello World" << endl; 

   return 0;
}

2) g++ -X cを使うか(推奨しません)、このコードをextern Cに入れる [免責事項、私はこれをテストしていません] 。