GCC: почему предупреждение о форматировании для этого fprintf? - PullRequest
3 голосов
/ 05 августа 2011

Мы убрали большое количество предупреждений.В некоторых случаях мы заменяли% s на% d.Все казалось нормальным, пока мы не поняли, что сгенерированный код не будет компилироваться - строки были заменены числами.

ПРИМЕЧАНИЕ: Когда я выполнял копирование и вставку, у меня была проверена неверная ревизия.Строка fprintf была отредактирована!

Вывод GCC

fedex_plus / classes.c: 2425: 3: предупреждение: формат '% s' ожидает аргумент типа 'char *' , но аргумент 3 имеет тип 'int' [-Wformat]

строки 2424и 2425:

fprintf(file, "\n//\t%s_ptr create_TIE();\n\tIDL_Application_instance_ptr create_TIE();\n", 
    ENTITYget_CORBAname(entity));

функция ENTITYget_CORBAname:

const char *
ENTITYget_CORBAname (Entity ent)
{
    static char newname [BUFSIZ];
    strcpy( newname, ENTITYget_name(ent) );
    newname[0] = ToUpper (newname [0]);
    return newname;
}

Ответы [ 4 ]

10 голосов
/ 05 августа 2011

Моя ставка заключается в том, что в fprintf нет объявления о ENTITYget_CORBAname.Если это так, то по умолчанию используется неявная подпись:

int ENTITYget_CORBAname(...);

, следовательно, предупреждение о типе результата: int.

Проверьте код с помощью -Wimplicit (подразумеваетсяна -Wall) или попробуйте поставить

const char *ENTITYget_CORBAname (Entity ent);

перед строкой fprintf и проверьте, исчезает ли предупреждение.Если это так, то вы, вероятно, пропустите заголовок.

1 голос
/ 05 августа 2011

Я предполагаю, что ENTITY_GETCorbaName() возвращает строку, поэтому, если вы хотите напечатать это, используйте %s.Если вы хотите напечатать его как указатель, используйте %p.

1 голос
/ 05 августа 2011

Если вы хотите напечатать значение указателя, используйте %p, если вы хотите напечатать строку, возвращенную из функции, используйте %s.Не используйте %d ни в одном из этих случаев.Смотри здесь .

0 голосов
/ 05 августа 2011

используйте %s в printf для печати этой строки или %p в printf для отображения значения указателя. Вы также можете использовать %lld для печати его значения

...