Я пытаюсь определить простую структуру, иметь один объект этого типа структуры и инициализировать элементы объекта. Когда я определяю структуру и объект глобально и инициализирую члены внутри функции, он компилируется и запускается правильно. Когда я пытаюсь инициализировать члены сразу после определения структуры и объекта, я получаю ошибку компиляции. Или, по крайней мере, это то, что я думаю, что я делаю, ошибка указывает, что я где-то что-то пропустил.
Это работает (некоторый код опущен):
struct globalArgs_t { //globalArgs_t is the type name
string input_filename;
int verbosity;
bool choose_channel;
} arguments; // arguments is an object of type globalArgs_t
void func(){
// Default values
arguments.input_filename = "pic.jpg";
arguments.verbosity = 0;
arguments.choose_channel = false;
//Do more stuff here
}
int main(int argc, char *argv[]){
func();
return 1;
}
Но это не компилируется (некоторый код опущен):
struct globalArgs_t { //globalArgs_t is the type name
string input_filename;
int verbosity;
bool choose_channel;
} arguments; // arguments is an object of type globalArgs_t;
// Default values
arguments.input_filename = "pic.jpg"; // Line 19
arguments.verbosity = 0; // Line 20
arguments.choose_channel = false; // Line 21
void func(){
//Do more stuff here
}
int main(int argc, char *argv[]){
func();
return 1;
}
Ошибка:
main.cpp:19:3: error: ‘arguments does not name a type
main.cpp:20:3: error: ‘arguments does not name a type
main.cpp:21:3: error: ‘arguments does not name a type
Я использую g++ и -std = С++ 0x для компиляции, если это имеет значение.
Благодарю.
Заявления идут внутри функций. Вы не можете поместить их в "глобальную область", как вы это сделали.
Это правильный синтаксис:
struct globalArgs_t { //globalArgs_t is the type name
string input_filename;
int verbosity;
bool choose_channel;
} arguments = {
"pic.jpg",
0,
false
};
Это пример агрегатной инициализации (эта структура является совокупностью).
К сожалению, C++ не поддерживает инициализацию с тегами в стиле C, и вы должны указывать значения для членов в том же порядке, в котором члены были указаны в определении структуры.
[edit: я удалил все свое сообщение]
После того, как вы объявили экземпляр структуры, вы можете инициализировать его с помощью инициализации конструктора или агрегата.
arguments
самом деле ссылаются на конкретный экземпляр так, как он объявлен. Это не структура C typedef struct
здесь.
int a=0;
это хорошо. Ноint a; a=0;
нет. Таким образом, синтаксис для инициализации структуры во время объявления именно то, что мне нужно.