error C2059
-
I am struggling from some time to an error:
error C2059: syntax error : ')'
I have somewhere in the old code:
#define list_entry(ptr, type, member) \
((type *)((char *)(ptr)-(size_t)(&((type *)0)->member))) // <-- here is the error ...I have tried this solution, without success: c - list_entry in Linux - Stack Overflow[^] How can I get rid of this error ? I am trying to integrate this code in an MFC project, and the code from above is from C code (for linux I guess)
-
I am struggling from some time to an error:
error C2059: syntax error : ')'
I have somewhere in the old code:
#define list_entry(ptr, type, member) \
((type *)((char *)(ptr)-(size_t)(&((type *)0)->member))) // <-- here is the error ...I have tried this solution, without success: c - list_entry in Linux - Stack Overflow[^] How can I get rid of this error ? I am trying to integrate this code in an MFC project, and the code from above is from C code (for linux I guess)
Syntactically that directive looks fine. Have you examined the preprocessor output (/P) to see what that directive looks like once expanded?
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
-
const int nTest = list_next_entry(0, 0); // <-- error C2059: syntax error : ')'
where
list_next_entry
is#define list_next_entry(pos, member) list_entry(0, 0, 0)
and
list_entry
is defined in the first post. P.S. Of course, 0 values are for testing purpose only. -
Syntactically that directive looks fine. Have you examined the preprocessor output (/P) to see what that directive looks like once expanded?
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
-
This is the content of your
.I
file? :confused:"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
-
const int nTest = list_next_entry(0, 0); // <-- error C2059: syntax error : ')'
where
list_next_entry
is#define list_next_entry(pos, member) list_entry(0, 0, 0)
and
list_entry
is defined in the first post. P.S. Of course, 0 values are for testing purpose only. -
const int nTest = list_next_entry(0, 0); // <-- error C2059: syntax error : ')'
where
list_next_entry
is#define list_next_entry(pos, member) list_entry(0, 0, 0)
and
list_entry
is defined in the first post. P.S. Of course, 0 values are for testing purpose only.Quote:
P.S. Of course, 0 values are for testing purpose only.
However they are bad arguments for a (very likely) legitimate macro. If you get the error with such arguments, then we cannot blame the compiler. On the other hand, if you're getting the same error with proper arguments then post such code here.
-
I am struggling from some time to an error:
error C2059: syntax error : ')'
I have somewhere in the old code:
#define list_entry(ptr, type, member) \
((type *)((char *)(ptr)-(size_t)(&((type *)0)->member))) // <-- here is the error ...I have tried this solution, without success: c - list_entry in Linux - Stack Overflow[^] How can I get rid of this error ? I am trying to integrate this code in an MFC project, and the code from above is from C code (for linux I guess)
This is a combination of all of the above responses. I have compiled this in mfc and it works. struct data { int something; }; struct container { int something_before; struct data data_item; int something_after; }; #define list_entry(ptr, type, member) \ ((type *)((char *)(ptr)-(size_t)(&((type *)0)->member))) // <-- here is the error ... struct data *data_ptr; struct container *cont_ptr = list_entry(data_ptr, struct container, data_item); // This is the code you say is not compiling. #define list_next_entry(pos, member) list_entry(0, 0, 0) // This error is caused by the above line because list_entry(0,0,0) '0' is not a valid data type. const int nTest = list_next_entry(0, 0); // <-- error C2059: syntax error : ')' // If you do this instead... #define list_next_entry(pos, member) list_entry(data_ptr, struct container, data_item) // You will get a new error you will have to resolve in some way. // error C2440: 'initializing' : cannot convert from 'container *' to 'const int' // 1> There is no context in which this conversion is possible // The compiler can't convert a pointer to an int. // Don't know what you are trying to do. const int nTest = list_next_entry(0, 0);
-
A good alternative is to not use
#define
directives in this way, as they only serve to confuse. -
Quote:
P.S. Of course, 0 values are for testing purpose only.
However they are bad arguments for a (very likely) legitimate macro. If you get the error with such arguments, then we cannot blame the compiler. On the other hand, if you're getting the same error with proper arguments then post such code here.
-
This is a combination of all of the above responses. I have compiled this in mfc and it works. struct data { int something; }; struct container { int something_before; struct data data_item; int something_after; }; #define list_entry(ptr, type, member) \ ((type *)((char *)(ptr)-(size_t)(&((type *)0)->member))) // <-- here is the error ... struct data *data_ptr; struct container *cont_ptr = list_entry(data_ptr, struct container, data_item); // This is the code you say is not compiling. #define list_next_entry(pos, member) list_entry(0, 0, 0) // This error is caused by the above line because list_entry(0,0,0) '0' is not a valid data type. const int nTest = list_next_entry(0, 0); // <-- error C2059: syntax error : ')' // If you do this instead... #define list_next_entry(pos, member) list_entry(data_ptr, struct container, data_item) // You will get a new error you will have to resolve in some way. // error C2440: 'initializing' : cannot convert from 'container *' to 'const int' // 1> There is no context in which this conversion is possible // The compiler can't convert a pointer to an int. // Don't know what you are trying to do. const int nTest = list_next_entry(0, 0);
-
This is a combination of all of the above responses. I have compiled this in mfc and it works. struct data { int something; }; struct container { int something_before; struct data data_item; int something_after; }; #define list_entry(ptr, type, member) \ ((type *)((char *)(ptr)-(size_t)(&((type *)0)->member))) // <-- here is the error ... struct data *data_ptr; struct container *cont_ptr = list_entry(data_ptr, struct container, data_item); // This is the code you say is not compiling. #define list_next_entry(pos, member) list_entry(0, 0, 0) // This error is caused by the above line because list_entry(0,0,0) '0' is not a valid data type. const int nTest = list_next_entry(0, 0); // <-- error C2059: syntax error : ')' // If you do this instead... #define list_next_entry(pos, member) list_entry(data_ptr, struct container, data_item) // You will get a new error you will have to resolve in some way. // error C2440: 'initializing' : cannot convert from 'container *' to 'const int' // 1> There is no context in which this conversion is possible // The compiler can't convert a pointer to an int. // Don't know what you are trying to do. const int nTest = list_next_entry(0, 0);
The original code is just like that:
#define list_next_entry(pos, member) list_entry((pos)->member.next, typeof(*(pos)), member)
but the errors is little more then:
error C2100: illegal indirection
error C2059: syntax error : ')'
error C2059: syntax error : 'bad suffix on number'
error C3861: 'typeof': identifier not foundall of them is in the same line ...
-
The original code is just like that:
#define list_next_entry(pos, member) list_entry((pos)->member.next, typeof(*(pos)), member)
but the errors is little more then:
error C2100: illegal indirection
error C2059: syntax error : ')'
error C2059: syntax error : 'bad suffix on number'
error C3861: 'typeof': identifier not foundall of them is in the same line ...
You can't use
->
or*
on a value of 0! That causes the compiler errors. Try any non-null value, and at least these compiler errors should go away. Moreover, typeof is not standard C/C++. There are implementations for that in the GCC extension for C, or in the BOOST library. You may need to find the correct BOOST library and include that in your project to make this code work.GOTOs are a bit like wire coat hangers: they tend to breed in the darkness, such that where there once were few, eventually there are many, and the program's architecture collapses beneath them. (Fran Poretto)
-
You can't use
->
or*
on a value of 0! That causes the compiler errors. Try any non-null value, and at least these compiler errors should go away. Moreover, typeof is not standard C/C++. There are implementations for that in the GCC extension for C, or in the BOOST library. You may need to find the correct BOOST library and include that in your project to make this code work.GOTOs are a bit like wire coat hangers: they tend to breed in the darkness, such that where there once were few, eventually there are many, and the program's architecture collapses beneath them. (Fran Poretto)
-
You can't use
->
or*
on a value of 0! That causes the compiler errors. Try any non-null value, and at least these compiler errors should go away. Moreover, typeof is not standard C/C++. There are implementations for that in the GCC extension for C, or in the BOOST library. You may need to find the correct BOOST library and include that in your project to make this code work.GOTOs are a bit like wire coat hangers: they tend to breed in the darkness, such that where there once were few, eventually there are many, and the program's architecture collapses beneath them. (Fran Poretto)
-
You can't use
->
or*
on a value of 0! That causes the compiler errors. Try any non-null value, and at least these compiler errors should go away. Moreover, typeof is not standard C/C++. There are implementations for that in the GCC extension for C, or in the BOOST library. You may need to find the correct BOOST library and include that in your project to make this code work.GOTOs are a bit like wire coat hangers: they tend to breed in the darkness, such that where there once were few, eventually there are many, and the program's architecture collapses beneath them. (Fran Poretto)
So, as a conclusion, the code is:
const int nTest = list\_next\_entry(0, 0);
where list_next_entry is defined:
#define list_next_entry(pos, member) \
list_entry((pos)->member.next, typeof(*(pos)), member)and list_entry is defined as:
#define list_entry(ptr, type, member) \
((type *)((char *)(ptr)-(size_t)(&((type *)0)->member)))and for this code I get:
error C2100: illegal indirection
error C2059: syntax error : ')'
error C2059: syntax error : 'bad suffix on number'
error C3861: 'typeof': identifier not foundat line "const int nTest = list_next_entry(0, 0);" I cannot get rid of these errors ... :(
-
So, as a conclusion, the code is:
const int nTest = list\_next\_entry(0, 0);
where list_next_entry is defined:
#define list_next_entry(pos, member) \
list_entry((pos)->member.next, typeof(*(pos)), member)and list_entry is defined as:
#define list_entry(ptr, type, member) \
((type *)((char *)(ptr)-(size_t)(&((type *)0)->member)))and for this code I get:
error C2100: illegal indirection
error C2059: syntax error : ')'
error C2059: syntax error : 'bad suffix on number'
error C3861: 'typeof': identifier not foundat line "const int nTest = list_next_entry(0, 0);" I cannot get rid of these errors ... :(
_Flaviu wrote:
I cannot get rid of these errors
And you will not get rid of them as long as you keep using 0 as the parameters to the
list_next_entry
call. The define uses specific C/C++ types that are not valid if replaced by 0. In the above case this code translates as follows:// your statement
const int nTest = list_next_entry(0, 0);// converts to:
list_entry((0)->0.next, typeof(*(0)), 0)which makes no sense at all.
-
_Flaviu wrote:
I cannot get rid of these errors
And you will not get rid of them as long as you keep using 0 as the parameters to the
list_next_entry
call. The define uses specific C/C++ types that are not valid if replaced by 0. In the above case this code translates as follows:// your statement
const int nTest = list_next_entry(0, 0);// converts to:
list_entry((0)->0.next, typeof(*(0)), 0)which makes no sense at all.
Here is the code:
const file\_info\* file = list\_first\_entry(&dir\_list->list, const file\_info, list); const file\_info\* file2 = td\_list\_next\_entry(file, list); // <-- errors
and I get the same errors:
error C2059: syntax error : ')'
error C3861: 'typeof': identifier not found