7

以前の質問を見ましたが、それでも満足できなかったので、これを投稿しています。私は他の誰かによって書かれたC++コードをコンパイルしようとしていました。

/*
file1.h
*/
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
    struct
    {   
        unsigned member1;
        unsigned  member2; 
    } str1;

    struct
    {
        unsigned member3;
        unsigned  member4; 
    } str2;

    struct
    {
        unsigned member5;
        unsigned  member6; 
    } str3;
} CONFIG_T;



/* 
file1.c
*/
CONFIG_T  cfg =
{
    .str1 = { 0x01, 0x02 },
    .str2 = { 0x03, 0x04 },
    .str3 = { 0x05, 0x06 }
};

std C ++ 11でコンパイルすると、以下のエラーが発生します。なぜ '。' 値を割り当てるときにコードで使用されましたか?

home $$  g++ -c -std=gnu++0x  initialze_list.cpp

initialze_list.cpp:34: error: expected primary-expression before ‘.’ token

initialze_list.cpp:35: error: expected primary-expression before ‘.’ token

initialze_list.cpp:36: error: expected primary-expression before ‘.’ token

エラーの理由がわかりませんでした。助けてください。

4

4 に答える 4

4

投稿したのはCコードであり、C ++コードではありません(.cファイル拡張子に注意してください)。ただし、次のコード:

CONFIG_T  cfg =
{
    { 0x01, 0x02 },
    { 0x03, 0x04 },
    { 0x05, 0x06 }
};

正常に動作するはずです。

wikiでC++11初期化リストについて読むこともできます。

于 2012-07-09T12:49:09.403 に答える
1

指定された集約初期化子はC99の機能です。つまり、C言語の機能です。C++には存在しません。

C ++としてコンパイルすることを主張する場合は、の初期化を書き直す必要がありますcfg

于 2012-07-09T14:22:23.220 に答える
1
/* 
file1.c
*/
CONFIG_T  cfg =
{
  .str1 = { 0x01, 0x02 },
  .str2 = { 0x03, 0x04 },
  .str3 = { 0x05, 0x06 }
};

そのコードは、指定された初期化子と呼ばれるC99機能を使用しています。ご覧のとおり、この機能はC++およびC++11では使用できません。


この回答で示唆されているように、CコードにはCコンパイラを使用する必要があります。それでもC++アプリケーションにリンクできます。cmakeビルド構成を行うために使用できます。簡単な例:

/* f1.h */
#ifndef MYHEADER
#define MYHEADER

typedef struct { int i, j; } test_t; 
extern test_t t;

#endif

/* f1.c */
#include "f1.h"
test_t t = { .i = 5, .j = 6 };

/* f0.cc */
extern "C" { #include "f1.h" }
#include <iostream>

int main() {
    std::cout << t.i << " " << t.j << std::endl;
}

# CMakeLists.txt
add_executable(my_executable f0.cc f1.c)

mkdir build; cd build; cmake ..; makeソースディレクトリから実行するだけです。

于 2012-07-09T14:23:48.657 に答える
0

ありがとうございます ...


すべての分析の結果、上記のコードには指定初期化子と呼ばれるC99機能があることがわかりました。

このコードをC++でコンパイルするために、以下のようにコードを通常の初期化に変更しました。

==========================

/*
 *  initialze_list.cpp 
 */

#include <stdio.h>

typedef struct
{
    struct
{   unsigned member1;
    unsigned  member2; 
} str1;
struct
{   unsigned member3;
    unsigned  member4; 
} str2;
struct
{   unsigned member5;
    unsigned  member6; 
} str3;
} CONFIG_T;

CONFIG_T  cfg =
{
 { 0x01, 0x02 },
 { 0x03, 0x04 },
 { 0x05, 0x06 }
};
/* End of file  */

==================================

このコードは、C++でエラーなしで正しくコンパイルされました。

$$ g ++ -c initialze_list.cpp

$$ g ++ -c -std = gnu ++ 0x initialze_list.cpp

于 2012-07-10T08:37:02.837 に答える