C++ error: expected primary-expression before ‘.’ token

15,778

Solution 1

What you posted is C code, not C++ code (note the .c file extention). However, the following code:

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

should work fine.

You can also read about C++11 initialize lists in the wiki.

Solution 2

Designated aggregate initializers is a C99 feature, i.e. it is a feature of C language. It is not present in C++.

If you insist on compiling it as C++, you'll have to rewrite the initialization of cfg.

Solution 3

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

That code is using a C99 feature called designated initializers. As you have observed, that feature is not available in C++ and C++11.


As suggested in this answer you should use a C compiler for C code. You can still link it to your C++ application. You could use cmake to do the build configuration for you. A simple example:

/* 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)

just run mkdir build; cd build; cmake ..; make from your source directory.

Share:
15,778
Ashoka K
Author by

Ashoka K

Updated on June 09, 2022

Comments

  • Ashoka K
    Ashoka K almost 2 years

    I looked at the earlier questions but still i was not satisfied, hence i am posting this. I was trying to compile the C++ code written by someone else.

    /*
    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 }
    };
    

    Compiled with std C++11 and i get below error. Why the '.' has been used in code while assigning values ?

    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
    

    I was not able to understand the reason for error. Please help.