I have this class I just wrote, see below. I am trying to create a utility class
for checking command line arguments in the argc
and argv
parameters of main()
.
class ArgumentGuard {
public:
ArgumentGuard() = default;
ArgumentGuard(int& argc, char const *argv[]) : _arc{argc}, _args{*argv} {}
bool has_arguments() const {
return _arc < 2 ? false : true;
}
private:
int _arc;
const char* _args[];
};
Usage:
int main(int argc, char const *argv[]) {
ArgumentGuard guard(argc, argv);
Error:
In constructor 'ArgumentGuard::ArgumentGuard(int&, const char**)':
error: initializer for flexible array member 'const char* ArgumentGuard::_args []'
60 | ArgumentGuard(int& argc, char const *argv[]) : _arc{argc}, _args{*argv} {}
| ^~~~~~~~~~~~~~~~~~~
In file included from sectra.cpp:1:
In constructor 'ArgumentGuard::ArgumentGuard(int&, const char**)':
error: initializer for flexible array member 'const char* ArgumentGuard::_args []'
60 | SectraArgumentGuard(int& argc, char const *argv[]) : _arc{argc}, _args{*argv} {}
| ^~~~~~~~~~~~~~~~~~~
In constructor 'ArgumentGuard::ArgumentGuard(int&, const char**)':
error: initializer for flexible array member 'const char* ArgumentGuard::_args []'
60 | ArgumentGuard(int& argc, char const *argv[]) : _arc{argc}, _args{*argv} {}
| ^~~~~~~~~~~~~~~~~~~
4
The syntax for C-style arrays can be tricky.
A function parameter like your char const *argv[]
isn’t actually an array – it’s shorthand for a pointer. It’s the same as char const **argv
.
Change your class so it is also managing a pointer – not an array.
class ArgumentGuard {
public:
ArgumentGuard() = default;
ArgumentGuard(int& argc, char const *argv[]) : _arc{argc}, _args(argv) {}
bool has_arguments() const {
return _arc < 2 ? false : true;
}
private:
int _arc;
const char** _args;
};