Как работает структура, союзы и т. Д., Когда задействованы функции? - PullRequest
0 голосов
/ 02 февраля 2019

Я недавно сталкивался со структурами, и некоторые вещи не совсем ясны.Допустим, у меня есть такая программа:

struct num print_a(struct num c); 

int main(){
  struct num{
    int a;
    int b;
  }c = {1, 2};
  struct num d;
  d = print_a(c);
}

struct num print_a(struct num c){
  printf("%d", c.a);
  return c;
}

Будет ли это работать или мне нужно объявить struct num вне main?Потому что как моя функция print_a "видит", что означает struct num (тип, который она должна возвращать), когда она объявлена ​​вне своей области видимости?

Извините, если вопрос тупой

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019
  1. Объявление

    struct num print_a(struct num c);
    

    в начале примера кода сообщает компилятору, что:

    • Вы обещаете определить struct num в области видимости файла.На данный момент компилятор помечает struct num как неполный тип , который можно использовать в (некоторых) объявлениях, например, для объявления (но не define ) функций,и объявить или определить указатель типы и переменные.Компилятор не будет придерживаться этого обещания, если вы на самом деле не попытаетесь использовать тип struct num.

      Вы должны завершить определение struct num до используя этот тип в определении или в объявлении, где его размер имеет значение.

    • Вы обещаете определить функцию с именем print_a, взяв struct num и вернув struct num.Компилятор не удержит вас этим обещанием, если вы на самом деле не попытаетесь использовать эту функцию - если вы не вызовете ее где-либо в программе, компилятор простит невыполненное обещание.

  2. struct num, определенный внутри функции main, не имеет ничего общего с неполным struct num в области видимости файла.Вы, конечно, можете пойти дальше и определить его, но это будет тень уровень файла struct num.

  3. Заявление

    d = print_a(c);
    

    внутри функции main неверно и заставит компилятор генерировать несколько сообщений об ошибках, потому что это нарушает ваши обещания.В частности, компилятор будет жаловаться, что вы пытаетесь использовать неполный тип struct num, объявленный в области видимости файла, как если бы он был завершен.Помните, что struct num, определенный внутри main, не имеет ничего общего с struct num на уровне файла.

  4. Определение функции

    struct num print_a(struct num c){ ... }
    

    невернопотому что вы не сдержали свое обещание определить тип struct num.Что внутри main есть другой тип с именем struct num не считается;этот тип можно использовать только внутри main.

Чтобы исправить программу, вам нужно переместить определение на struct num до main.Это может быть до или после декларации из print_a.

0 голосов
/ 02 февраля 2019

Будет ли это работать или мне нужно объявить struct num вне main?

Ну, а почему бы просто не попробовать?

http://ideone.com дает:

Compilation error #stdin compilation error #stdout 0s 9424KB
prog.c: In function ‘main’:
prog.c:11:15: error: type of formal parameter 1 is incomplete
   d = print_a(c);
               ^
prog.c:11:3: error: invalid use of undefined type ‘struct num’
   d = print_a(c);
   ^
prog.c:10:14: warning: variable ‘d’ set but not used [-Wunused-but-set-variable]
   struct num d;
              ^
prog.c: At top level:
prog.c:14:31: error: parameter 1 (‘c’) has incomplete type
 struct num print_a(struct num c){
                               ^
prog.c:14:12: error: return type is an incomplete type
 struct num print_a(struct num c){
            ^~~~~~~
prog.c:14:12: error: conflicting types for ‘print_a’
prog.c:3:12: note: previous declaration of ‘print_a’ was here
 struct num print_a(struct num c);
            ^~~~~~~
prog.c: In function ‘print_a’:
prog.c:16:10: warning: ‘return’ with a value, in function returning void
   return c;
          ^
prog.c:14:12: note: declared here
 struct num print_a(struct num c){
            ^~~~~~~

http://coliru.stacked -crooked.com / дает:

main.cpp: In function 'main':
main.cpp:13:15: error: type of formal parameter 1 is incomplete
   d = print_a(c);
               ^
main.cpp:13:7: error: invalid use of undefined type 'struct num'
   d = print_a(c);
       ^~~~~~~
main.cpp:12:14: warning: variable 'd' set but not used [-Wunused-but-set-variable]
   struct num d;
              ^
main.cpp: At top level:
main.cpp:16:31: error: parameter 1 ('c') has incomplete type
 struct num print_a(struct num c){
                    ~~~~~~~~~~~^
main.cpp:16:12: error: return type is an incomplete type
 struct num print_a(struct num c){
            ^~~~~~~
main.cpp:16:12: error: conflicting types for 'print_a'
main.cpp:5:12: note: previous declaration of 'print_a' was here
 struct num print_a(struct num c);
            ^~~~~~~
main.cpp: In function 'print_a':
main.cpp:18:10: warning: 'return' with a value, in function returning void
   return c;
          ^
main.cpp:16:12: note: declared here
 struct num print_a(struct num c){
            ^~~~~~~

Хммм ... отчасти дают нам ответ: нет - это не будет работать

Когда вы определяете структуру внутри main, она известна только внутри main.Если вы хотите использовать структуру вне main, вы должны переместить определение структуры из main - например:

struct num {
    int a;
    int b;
};

struct num print_a(struct num c); 

int main(){
  struct num c = {1, 2};
  struct num d;
  d = print_a(c);
}

struct num print_a(struct num c){
  printf("%d", c.a);
  return c;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...