error C2059
-
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 -
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_Flaviu wrote:
and I get the same errors:
error C2059: syntax error : ')'
error C3861: 'typeof': identifier not foundOf course you must get these error messages! Just because
Quote:
'typeof'
does not exist in MFC (nor in Microsoft C++)
-
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 foundDid you try to use [decltype (C++) | Microsoft Docs](https://docs.microsoft.com/en-us/cpp/cpp/decltype-cpp?view=vs-2019) rather than typeof?
-
Did you try to use [decltype (C++) | Microsoft Docs](https://docs.microsoft.com/en-us/cpp/cpp/decltype-cpp?view=vs-2019) rather than typeof?
I have tried:
#define list_next_entry(pos, member) \
list_entry((pos)->member.next, decltype(*(pos)), member)and I get another errors:
error C2528: 'abstract declarator' : pointer to reference is illegal
error C2528: 'abstract declarator' : pointer to reference is illegal
error C2227: left of '->list' must point to class/struct/union/generic typeseem to go for solving :) ... 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)
After referring to the SO link you helpfully provided, I finally understand what this macro is intended for. The solution is simple: don't use this macro! It is intended for an extremely specific purpose with specific classes/structs, and it must be used with very specific arguments. If you don't know how to use it correctly, the preprocessor will generate garbagage code, and the compiler unintellegible errors! The purpose is some low level memory address juggling which makes a whole lot of assumptions on behalf of the parameters being passed, without giving the compiler any information about what is going on. This is highly explosive stuff! Obviously you have no idea what parameters to pass and how to use it, probably not even what to use it for. Please don't do that and stop before anyone gets hurt. The only thing that's worse than using #define macros in C++ is using other peoples #define macros without being 200% sure what it does and how it's supposed to be used. If you need to ask what it does or why it doesn't work, then just drop it. Instead, just tell us what goal you intend to achieve, so we can advise you on proper C++ ways of solving your problem.
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)
-
I have tried:
#define list_next_entry(pos, member) \
list_entry((pos)->member.next, decltype(*(pos)), member)and I get another errors:
error C2528: 'abstract declarator' : pointer to reference is illegal
error C2528: 'abstract declarator' : pointer to reference is illegal
error C2227: left of '->list' must point to class/struct/union/generic typeseem to go for solving :) ... I guess ...
-
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 foundTook me a while to figure it out, but decltype(*pos) will give you a reference type, and the parts of the macro using this type to cast to type* then fail, because you can't create a pointer to a reference! However, that's where std::remove_reference comes to the rescue! Try these definitions:
#include // for std::remove_reference
using namespace std;
#define list_entry(ptr, type, member) \
((type *)((char *)(ptr)-(size_t)(&((type *)nullptr)->member)))
#define list_next_entry(pos, member) \
list_entry((pos)->member.next, remove_reference< decltype(*(pos)) >::type, member)P.S.: are you sure the second #define you posted is correct? I could make up some type definitions that I could use with these macros without encountering compiler errors, but I'm not at all sure the macros would provide a valid pointer for these types! Here's the code I used to validate there are no compiler errors:
struct link
{
struct link* next;
};
struct node
{
int a;
link b;
int c;
};
int main()
{
node y = { 3, nullptr, 2 };
node x = { 5, &y.b, 4 };
node* p = list_next_entry(&x, b);
cout << "value = " << p->a << endl;return 0;
}
It did compile, but the output was some random number, not 3 as I expected. I suspect that either the structs or that second #define must be defined differently... P.P.S.: it compiles and prints value = 3 as expected.
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)
-
Took me a while to figure it out, but decltype(*pos) will give you a reference type, and the parts of the macro using this type to cast to type* then fail, because you can't create a pointer to a reference! However, that's where std::remove_reference comes to the rescue! Try these definitions:
#include // for std::remove_reference
using namespace std;
#define list_entry(ptr, type, member) \
((type *)((char *)(ptr)-(size_t)(&((type *)nullptr)->member)))
#define list_next_entry(pos, member) \
list_entry((pos)->member.next, remove_reference< decltype(*(pos)) >::type, member)P.S.: are you sure the second #define you posted is correct? I could make up some type definitions that I could use with these macros without encountering compiler errors, but I'm not at all sure the macros would provide a valid pointer for these types! Here's the code I used to validate there are no compiler errors:
struct link
{
struct link* next;
};
struct node
{
int a;
link b;
int c;
};
int main()
{
node y = { 3, nullptr, 2 };
node x = { 5, &y.b, 4 };
node* p = list_next_entry(&x, b);
cout << "value = " << p->a << endl;return 0;
}
It did compile, but the output was some random number, not 3 as I expected. I suspect that either the structs or that second #define must be defined differently... P.P.S.: it compiles and prints value = 3 as expected.
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)
-
Soon as I put
#include // for std::remove_reference
in file.h I got:
error C2894: templates cannot be declared to have 'C' linkage
for more than 100 times ... what settings should I use to get rid of this error ?
See here: visual c++ - error C2894: templates cannot be declared to have 'C' linkage - Stack Overflow[^] Make sure that type_traits gets included outside of the
extern "C" { ... }
block.
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)
-
Took me a while to figure it out, but decltype(*pos) will give you a reference type, and the parts of the macro using this type to cast to type* then fail, because you can't create a pointer to a reference! However, that's where std::remove_reference comes to the rescue! Try these definitions:
#include // for std::remove_reference
using namespace std;
#define list_entry(ptr, type, member) \
((type *)((char *)(ptr)-(size_t)(&((type *)nullptr)->member)))
#define list_next_entry(pos, member) \
list_entry((pos)->member.next, remove_reference< decltype(*(pos)) >::type, member)P.S.: are you sure the second #define you posted is correct? I could make up some type definitions that I could use with these macros without encountering compiler errors, but I'm not at all sure the macros would provide a valid pointer for these types! Here's the code I used to validate there are no compiler errors:
struct link
{
struct link* next;
};
struct node
{
int a;
link b;
int c;
};
int main()
{
node y = { 3, nullptr, 2 };
node x = { 5, &y.b, 4 };
node* p = list_next_entry(&x, b);
cout << "value = " << p->a << endl;return 0;
}
It did compile, but the output was some random number, not 3 as I expected. I suspect that either the structs or that second #define must be defined differently... P.P.S.: it compiles and prints value = 3 as expected.
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)