yarkov
@yarkov
Помог ответ? Отметь решением.

Как побороть warnings?

/* Filename: a.c */

#include <stdlib.h>
#include <getopt.h>

struct argkeys {
    const char *name;
    int *shortname;
    char *helpstr;
    char *manstr;
    char *description;
};
extern const struct argkeys ArgKeys[];

/* Source: <getopt.h> */
int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);
extern char *optarg;
extern int optind, opterr, optopt;

const struct argkeys ArgKeys[] = {
    {"help", "h", "-h, --help", "-h[--help]", "description"},
    {"version", "v", "-v, --version", "-v[--version]", "description"}
};

int main (int argc, char * const argv[], char * const argp[])
{
    const struct option long_options[] = {
        {ArgKeys[0].name, optional_argument, NULL, ArgKeys[0].shortname},
        {ArgKeys[1].name, optional_argument, NULL, ArgKeys[1].shortname},
        {NULL, 0, NULL, 0}
    };
}


$ cc -Wall -c ./a.c
./a.c:19:5: warning: initialization from incompatible pointer type [enabled by default]
     {"help", "h", "-h, --help", "-h[--help]", "description"},
     ^
./a.c:19:5: warning: (near initialization for ‘ArgKeys[0].shortname’) [enabled by default]
./a.c:20:5: warning: initialization from incompatible pointer type [enabled by default]
     {"version", "v", "-v, --version", "-v[--version]", "description"}
     ^
./a.c:20:5: warning: (near initialization for ‘ArgKeys[1].shortname’) [enabled by default]
./a.c: In function ‘main’:
./a.c:26:9: warning: initialization makes integer from pointer without a cast [enabled by default]
         {ArgKeys[0].name, optional_argument, NULL, ArgKeys[0].shortname},
         ^
./a.c:26:9: warning: (near initialization for ‘long_options[0].val’) [enabled by default]
./a.c:27:9: warning: initialization makes integer from pointer without a cast [enabled by default]
         {ArgKeys[1].name, optional_argument, NULL, ArgKeys[1].shortname},
         ^
./a.c:27:9: warning: (near initialization for ‘long_options[1].val’) [enabled by default]
./a.c:25:25: warning: unused variable ‘long_options’ [-Wunused-variable]
     const struct option long_options[] = {
                         ^
./a.c:30:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^


Оно то работает, но никак не пойму смысл этих варнингов. Я уже гугл перелопатил... С учу несколько дней всего, так что сильно не пинайте.
  • Вопрос задан
  • 355 просмотров
Решения вопроса 2
@Mercury13
Программист на «си с крестами» и не только
19/20. Полю int* argkeys::shortName вы присваиваете строковый литерал, то есть const char*.
26/27. 4-му полю int option::val вы присваиваете argkeys::shortName то есть int*.
25. Переменная не задействована.
30. Функция ничего не возвращает.

Си, как нормальный кроссплатформенный ассемблер, такие присваивания с вопиющим несоответствием типов терпит, но поскольку это часто признаки ошибки в программе, выводит предупреждение.

Что могу предположить? В структуре int* shortName заменил бы на int id или char id, и присвоил бы ему символьный литерал (то есть 'h'). Это автоматически решит и второе предупреждение (как только заменим там shortName на id).
А 25 и 30 — сначала допишите программу до конца.
Ответ написан
Комментировать
yarkov
@yarkov Автор вопроса
Помог ответ? Отметь решением.
В общем я нашел проблему КМК )) Если заменить двойные кавычки на одинарные, то тип int будет работать:
...
struct argkeys {
    const char *name;
    int shortname;
    char *helpstr;
    char *manstr;
    char *description;
};
extern const struct argkeys ArgKeys[];

const struct argkeys ArgKeys[] = {
    {"help", 'h', "-h, --help", "-h[--help]", "description"},
    {"version", 'v', "-v, --version", "-v[--version]", "description"}
};
...

Уважаемый Mercury13 , вы совершенно правы. По первым двум пунктам, что вы подметили, я как только не пытался писать. А потом заменил кавычки и о чудо )) Можете объяснить почему так? Или как запрос составить, чтоб почитать?
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@dmtrrr
Backend developer
main должен возвращать значение.
Ответ написан
x67
@x67
простым решением будет удалить весь код. Золотое правило: нет кода - нет варнингов!
Warning - предупреждение о том, что где-то что-то криво написано и раз в год может выстрелить, поэтому гуглишь каждый варнинг, вникая в смысл и исправляешь.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
23 нояб. 2024, в 21:53
30000 руб./за проект
23 нояб. 2024, в 21:49
1000 руб./в час
23 нояб. 2024, в 20:48
40000 руб./за проект