идентификатор snprintf не определен

Я пытаюсь скомпилировать консольное приложение C на машине HP-UX с помощью компилятора aCC [HP C/aC++ B3910B A.06.26]. Компиляция всегда завершается с ошибкой ниже:

******"Common/Common.c", line 153: error #2020: identifier "snprintf" is undefined
          snprintf( BufferMessage, MSG_SIZE,
          ^
1 error detected in the compilation of "Common/Common.c".
gmake: *****[Common/Common.o] Error 2********

Однако файл Common.C уже включает библиотеку, которая обычно содержит метод snprintf. любая идея, чтобы решить эту проблему плз? Заранее спасибо за все


person jamel    schedule 24.04.2013    source источник


Ответы (2)


snprintf() был введен в C99 и определен в <stdio.h>, поэтому ваш компилятор должен поддерживать эта версия стандарта C. Если он не поддерживает C99, используйте вместо него sprintf().

person hmjd    schedule 24.04.2013
comment
Это версия 6 компилятора, документально подтвержденная поддержка C99. - person paxdiablo; 24.04.2013
comment
@paxdiablo, я не знаком с этим компилятором, какие-либо необходимые переключатели компилятора, такие как gcc? - person hmjd; 24.04.2013
comment
Согласно HP, компилятор [HP C/aC++ B3910B A.06.26] поддерживает C99. Я не разрабатываю приложение, мы просто пытаемся его скомпилировать, это немного странно, потому что мне удалось скомпилировать тот же код с более старой версией того же компилятора HP. Спасибо - person jamel; 24.04.2013
comment
@jamel, есть ли какие-либо переключатели компилятора для включения поддержки C99? Например, gcc -std=c99 требуется для компилятора GNU C. - person hmjd; 24.04.2013
comment
Да, эта версия поддерживает C99 - person jamel; 24.04.2013
comment
Я не нашел никакого флага для включения поддержки C99, кажется, он поддерживается по умолчанию :) - person jamel; 24.04.2013
comment
@jamel, а в исходном файле есть #include <stdio.h>? - person hmjd; 24.04.2013
comment
@hmjd: да, есть включение в stdio.h и string.h #include ‹stdio.h› #include ‹string.h› #include ‹stdlib.h› - person jamel; 24.04.2013

Версия 6 компилятора HPUX C совместима с C99, но для ее включения могут потребоваться переключатели.

В примечаниях к выпуску 6.20 указано, что следующий выпуск должен переключить режим по умолчанию с C89 на C90, а вы используете 6.26. Похоже, это произошло в версии 6.25, которая была выпущена после версии 6.20.

Вы можете форсировать режим C99, используя cc -AC99 (или cc -Ae теперь, когда C99 используется по умолчанию), чтобы посмотреть, поможет ли это. Может случиться так, что, хотя режим компиляции C по умолчанию — C99, вам все равно придется указать, что это C, а не C++.

Некоторые другие вещи, чтобы проверить:

  • Посмотрите, включили ли вы заголовок stdio.h.
  • Посмотрите, не возникнет ли у вас аналогичная проблема только с printf, которая также есть в этом заголовке.
  • Запустите компилятор, генерирующий вывод препроцессора (cc -E), и убедитесь, что он где-то определен.
person paxdiablo    schedule 24.04.2013
comment
Великий человек, я добавил -AC99, и идентификатор «snprintf» не определен. Большое человеческое спасибо и Спасибо за ВСЕ! - person jamel; 24.04.2013
comment
@jamel, возможно, он компилировался в режиме C++. Было бы интересно посмотреть, исправит ли это -Ae, так как это будет означать, что это так. Как уже говорилось, режим компиляции C по умолчанию — C99 по состоянию на 6.25, но может случиться так, что вам все равно придется сказать, что это C. И, если это действительно решение, вы должны проголосовать и/или принять, чтобы правильные ответы поднимались наверх - так работает ТАК. - person paxdiablo; 24.04.2013