C++ error: expected primary-expression before ‘.’ token
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.
Ashoka K
Updated on June 09, 2022Comments
-
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.