c ++ определяет и инициализирует структуру глобально

0

Я пытаюсь определить простую структуру, иметь один объект этого типа структуры и инициализировать элементы объекта. Когда я определяю структуру и объект глобально и инициализирую члены внутри функции, он компилируется и запускается правильно. Когда я пытаюсь инициализировать члены сразу после определения структуры и объекта, я получаю ошибку компиляции. Или, по крайней мере, это то, что я думаю, что я делаю, ошибка указывает, что я где-то что-то пропустил.

Это работает (некоторый код опущен):

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

2 ответа

1
Лучший ответ

Заявления идут внутри функций. Вы не можете поместить их в "глобальную область", как вы это сделали.

Это правильный синтаксис:

struct globalArgs_t { //globalArgs_t is the type name
  string input_filename;
  int verbosity;
  bool choose_channel;
} arguments = {
  "pic.jpg",
  0,
  false
};

Это пример агрегатной инициализации (эта структура является совокупностью).

К сожалению, C++ не поддерживает инициализацию с тегами в стиле C, и вы должны указывать значения для членов в том же порядке, в котором члены были указаны в определении структуры.

  • 0
    Потрясающий ответ. Благодарю. Ключевой частью, которую я пропустил, было то, что вы можете делать некоторые вещи вне основного, но не другие. Поэтому я думаю, что вы можете инициализировать после объявления вне main, но вы не можете обновить значения. int a=0; это хорошо. Но int a; a=0; нет. Таким образом, синтаксис для инициализации структуры во время объявления именно то, что мне нужно.
0

[edit: я удалил все свое сообщение]

После того, как вы объявили экземпляр структуры, вы можете инициализировать его с помощью инициализации конструктора или агрегата.

  • 1
    Хорошо написанный ответ, но проблема ОП заключается в контексте, в котором он пытается присвоить значения. arguments самом деле ссылаются на конкретный экземпляр так, как он объявлен. Это не структура C typedef struct здесь.
  • 0
    Ах! Спасибо! Я пропустил это. Также очевидно, что он использует этот метод намеренно! Моя вина полностью!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню