Not sure what I’m doing wrong here. I have a struct that is used heavily through my program.
typedef struct _MyStruct {
// ... handful of non-trivial fields ...
} MyStruct;
I expect (read, intend) for lots of parts of the program to return one of these structs, but many of them should be able to return a “null” struct, which is a singleton/global. The exact use case is for the implementing function to say “I can’t find what you asked me to return”.
I assumed this would be a simple case of defining a variable in a header file, and initializing it in the .c file.
// MyStruct.h
// ... Snip ...
MyStruct NotFoundStruct;
–
// MyStruct.c
NotFoundStruct.x = 0;
NotFoundStruct.y = 0;
// etc etc
But the compiler complains that the initialization is not constant.
Since I don’t care about what this global actually references in memory, I only care that everything uses the same global, I tried just removing the initialization and simply leaving the definition in the header.
But when I do this:
MyStruct thing = give_me_a_struct(some_input);
if (thing == NotFoundStruct) {
// ... do something special
}
Th compiler complains that the operands to the binary operator “==” (or “!=”) are invalid.
How does one define such as globally re-usable (always the same memory address) struct?
But since you can’t use the
==operator, you will have to find another way to distinguish it. One (not ideal) way is to have aboolflag reserved to indicate validity. That way, only that must be checked to determine if it’s a valid instance.But I think you should consider James’s proposed solution instead