|
I have met an error that I cannot rid of:
error C2061: syntax error : identifier 'mode_t'
The fact is that this 'mode_t' is not declared in my sources, and I haven't founded on internet ... how can I get rid of this error ? Thank you for any hint, any suggestion !
|
|
|
|
|
|
Thank you Victor. Might be the late hour, I have seen that page, and I included
<sys/stat.h>
no change ...
|
|
|
|
|
I would guess that in some other platform it is used to refer to the following line of the stat type:
unsigned short st_mode;
Which you could verify by checking the original source.
So you could just add the following above your includes
typedef unsigned short mode_t;
|
|
|
|
|
_Flaviu wrote: how can I get rid of this error ? Use an int .
"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
|
|
|
|
|
I've met a weird error:
error C2678: binary '|=' : no operator found which takes a left-hand operand of type 'FILE_ATTR_FLAGS' (or there is no acceptable conversion)
1> c:\program files (x86)\microsoft sdks\windows\v7.0a\include\propsys.h(703): could be 'GETPROPERTYSTOREFLAGS &operator |=(GETPROPERTYSTOREFLAGS &,GETPROPERTYSTOREFLAGS)'
1> c:\program files (x86)\microsoft sdks\windows\v7.0a\include\propsys.h(1685): or 'PROPDESC_TYPE_FLAGS &operator |=(PROPDESC_TYPE_FLAGS &,PROPDESC_TYPE_FLAGS)'
1> c:\program files (x86)\microsoft sdks\windows\v7.0a\include\propsys.h(1704): or 'PROPDESC_VIEW_FLAGS &operator |=(PROPDESC_VIEW_FLAGS &,PROPDESC_VIEW_FLAGS)'
........
........
1> c:\program files (x86)\microsoft sdks\windows\v7.0a\include\shobjidl.h(31763): or 'HOMEGROUPSHARINGCHOICES &operator |=(HOMEGROUPSHARINGCHOICES &,HOMEGROUPSHARINGCHOICES)'
1> c:\program files (x86)\microsoft sdks\windows\v7.0a\include\shobjidl.h(32037): or 'LIBRARYOPTIONFLAGS &operator |=(LIBRARYOPTIONFLAGS &,LIBRARYOPTIONFLAGS)'
1> c:\program files (x86)\microsoft sdks\windows\v7.0a\include\shobjidl.h(32052): or 'LIBRARYSAVEFLAGS &operator |=(LIBRARYSAVEFLAGS &,LIBRARYSAVEFLAGS)'
1> c:\program files (x86)\microsoft sdks\windows\v7.0a\include\shobjidl.h(32793): or 'LIBRARYMANAGEDIALOGOPTIONS &operator |=(LIBRARYMANAGEDIALOGOPTIONS &,LIBRARYMANAGEDIALOGOPTIONS)'
1> c:\program files (x86)\microsoft sdks\windows\v7.0a\include\thumbcache.h(119): or 'WTS_FLAGS &operator |=(WTS_FLAGS &,WTS_FLAGS)'
1> c:\program files (x86)\microsoft sdks\windows\v7.0a\include\thumbcache.h(127): or 'WTS_CACHEFLAGS &operator |=(WTS_CACHEFLAGS &,WTS_CACHEFLAGS)'
1> c:\program files (x86)\microsoft sdks\windows\v7.0a\include\shlobj.h(542): or 'SHELL_LINK_DATA_FLAGS &operator |=(SHELL_LINK_DATA_FLAGS &,SHELL_LINK_DATA_FLAGS)'
1> c:\program files (x86)\microsoft sdks\windows\v7.0a\include\shlobj.h(1394): or 'KNOWN_FOLDER_FLAG &operator |=(KNOWN_FOLDER_FLAG &,KNOWN_FOLDER_FLAG)'
1> while trying to match the argument list '(FILE_FLAGS, FILE_FLAGS)'
Here is the code that generate the error:
sc->flags |= flag;
where flag is FILE_FLAGS, and sc->flags is
struct scr {
....
....
FILE_FLAGS flags;
....
};
Now, of course that I'ave tried:
scr& operator|=(const scr& rhs)
{
return *this;
}
but this error doesn't disappeared ... have you met this kind of error ? I have to mention that I wrote here the simplified code ...
|
|
|
|
|
Where is FILE_FLAGS defined? IN your code, or in a system header?
|
|
|
|
|
Is defined inside of one of my code header:
typedef enum {
FILE_READONLY = 0x00000001,
FILE_HIDDEN = 0x00000002,
FILE_SYSTEM = 0x00000004,
FILE_DIRECTORY = 0x00000010,
FILE_ARCHIVE = 0x00000020,
FILE_DEVICE = 0x00000040,
FILE_NORMAL = 0x00000080,
FILE_TEMPORARY = 0x00000100,
....
.....
}FILE_FLAGS;
|
|
|
|
|
This works but is not really correct.
sc->flags = FILE_FLAGS(sc->flags | flag);
I suspect the issue is that enums are usually used to signify single values, i.e the flags field is either FILE_READONLY or FILE_SYSTEM, but not both. If you need to combine values then you should really use a set of #define statements.
|
|
|
|
|
Thank you Richard, that error has vanished, but I cannot try this code yet ... why do you say that this solution is not really correct ? The safe solution would be to overload |= operator, but I cannot do that into enum , right ?
|
|
|
|
|
_Flaviu wrote: why do you say that this solution is not really correct ? Because, as I mentioned before, enums are used to indicate a set of possible values for an item. For example a class of type Car could contain an enum that indicates the manufacturer, such that the enum definition is:
enum manufacturer
{
AUDI = 1,
BMW,
DAIMLER,
MERCEDES,
}
And you would never combine thos values in the car type variable.
So, in your case you should use #define statements, which the compiler will be happy with.
|
|
|
|
|
But this enum is not a part of any struct or class, is just defined into a header file, along with other several enum 's ... and this enum has a lot of values, that is why I intend to avoid to translated as #define's ... I don't know what to do ...
modified 6-Oct-19 11:33am.
|
|
|
|
|
But the issue is, as I keep repeating, that this is not the correct way to use enum s. If you want to combine flag values then use #define , if you want to select one value from a set then use enum . That is the rule for C and C++, and that is why the compiler complains about your code.
|
|
|
|
|
Thank you Richard for your patience. BTW, is a legacy code, is not written by me. There will be more suitable to chnage this enum to a struct and where to overload |= operator ?
modified 6-Oct-19 12:57pm.
|
|
|
|
|
Why would you change it to a struct, it only requires a single integer variable to hold all the flags.
int flags = FILE_READONLY | FILE_HIDDEN;
flags |= FILE_SYSTEM;
|
|
|
|
|
So the finest solution is to take these values from enum and put them as #define s. I will do this change.
|
|
|
|
|
I am afraid that I cannot change that enum into #defines, because I have:
na->flags |= flag;
where
FILE_FLAGS flag;
and
na is struct level1, and inside this level1 struct, I have
struct level1
{
FILE_FLAGS flags;
....
};
I have entered in some deadlock ? Please help me to solve this error ...
|
|
|
|
|
Try to declare both flags and flag as int
|
|
|
|
|
Yes, but FILE_FLAGS is enum with int values ...
|
|
|
|
|
Then, as Richard already suggested replace this enum with a set of #define.
|
|
|
|
|
Agree, but that enum is a part of another struct ... so, how can I put as part of a struct several #defines ?
|
|
|
|
|
Of course you can change it to #defines. The definition of FILE_FLAGS then becomes an int type. And then the rest of the code should compile correctly.
|
|
|
|
|
I am not get something, so forgive me.
I have moved those enum values as #defines , but of course, now I get error from struct : doesn't know who is FILE_FLAGS flags; from level1 struct.
#define FILE_READONLY = 0x00000001
#define FILE_HIDDEN = 0x00000002
#define FILE_SYSTEM = 0x00000004
of course, FILE_FLAGS enum has disappeared ... obviously, I don't understood something ... but what ?
struct level1
{
FILE_FLAGS flags; ....
};
|
|
|
|
|
_Flaviu wrote: struct level1
{
FILE_FLAGS flags;
....
};
Try
struct level1
{
int flags; ....
};
|
|
|
|
|
Ok, but even flag is comming as function parameter, just like this:
static void SomeFunction(level1* na, FILE_FLAGS flag)
{
....
na->flags |= ~flag;
....
}
So, I guess I cannot give up FILE_FLAGS enum ... don't I ?
|
|
|
|