2009-09-03 6 views
0

Я пытаюсь перестроить чей-то старый проект на C++, используя Dev-C++ (версия 4.9.9.2) и стандартный компилятор, с которым он поставляется (я думаю, g ++ с использованием MinGW) под Windows XP Pro SP3 32-бит. В одном из файлов strsafe.h включается и когда я пытаюсь скомпилировать, я получаю эту ошибку:Ожидаемое первичное выражение перед ',' token в strsafe.h

expected primary-expression before ',' token 

строк кода, что ошибка указывает на находящиеся в strsafe.h (а() библиотеки Microsoft? заголовочный файл) все выглядят примерно так:

hr = StringGetsExWorkerA(pszDest, cchDest, cbDest, NULL, NULL, 0); 

Для каждой из этих строк есть 2 "ожидаемых первичных выражения". Я нашел this forum thread, который предполагает, что значение NULL не распознается должным образом и предполагает, что я включил <cstddef> перед strsafe.h. Я сделал это, и это не сработало. Кроме того, кажется, что NULL на самом деле определен, потому что когда я делаю «#define NULL 0» перед включением strsafe.h, я получаю сообщение об ошибке, указывающее, что я его переопределяю.

Извините, но я не могу предоставить более подробную информацию, но код для воспроизведения этой ошибки - это просто «#include <strsafe.h>», поэтому я не знаю, что еще сказать. Кто-нибудь знает, что может происходить и как я могу это исправить?

Спасибо!

(я уже пытался загрузить последнюю версию Microsoft Platform SDK, так что я иметь последнюю актуальную версию strsafe.h)

+0

Какая версия используемого SDK (какой полный путь к strsafe.h)? В моей копии из Vista SDK нет упоминаний о StringGetsExWorkerA(). –

+0

Кажется, что подобная проблема упоминается на отдельном форуме: http://forums1.avsim.net/index.php?s = 6bf19a616003413c15cf25212fde2352 & showtopic = 244719 & PID = 1617949 & й = 0 & # entry1617949. Форум упоминает strsafe.h и MinGW в частности. Не могли бы вы попробовать, что они сделали, чтобы решить эту проблему? – reuben

+0

Я загрузил версию PSDK-x86 отсюда: http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en#filelist (Windows® Server 2003 SP1 Platform SDK). Путь к strsafe.h - «C: \ Program Files \ Microsoft Platform SDK \ Include \ strsafe.h». @Rueben: «Решение» похоже на использование другой среды/компилятора? Я пробовал MSVC++, и у меня были другие проблемы для проекта, но вы правы в том, что у меня нет проблемы, о которой я спрашивал здесь. – Jordi

ответ

0

Интересно, что NULL определяется как? Может быть, это не 0, это может быть что угодно (хотя было бы странно, если бы кто-то определил NULL как нечто отличное от 0).

Попробуйте следующее и посмотрите, работает ли оно.

#undef NULL 
#define NULL 0 
+0

В C NULL обычно определяется как (void *) 0, хотя он является прямым 0 в C++. –

+0

Это действительно сработало. (теперь у меня есть другие проблемы, но эта проблема разрешена с использованием этих двух строк кода) – Jordi

+0

@Tyler, в C или C++ нет такой вещи, как NULL. некоторые/большинство компиляторов могут определить его как (void *) 0 или 0, но абсолютно ничего не прекращается, если какой-либо код заголовка/библиотеки/третьей стороны или компилятор определяет NULL как что-то еще. NULL не входит в стандарт, поэтому его не следует использовать – Glen

0

Мои первоначальные мысли состоят в том, что хотя бы один из этих идентификаторов еще не объявлен.

Попробуйте следующее:

  • Проверьте документацию компилятора для опции генерировать препроцессированный вывод (и генерировать его)
  • Найдите эту линию препроцессированного выход и
  • Для каждого идентификатора, в свою очередь, поиск назад, чтобы найти свою декларацию

Вы можете обнаружить, что идентификаторы не объявлены или что один из них объявлен как тип, а не объект.

0

Просматривая strsafe.h файл кажется, как эта функция является внутренним один (он окружен #ifndef STRSAFE_LIB_IMPL .... #endif блоков) и обернута вокруг функций, таких как StringCbGetsExA или StringCbGetsExA. Разве вы не должны использовать их вместо этого?

+0

Это происходит практически со всеми функциями, и, кроме того, я даже не думаю, что я называю эту функцию. Просто включение библиотеки приводит к сбою компиляции. – Jordi

0

Я думаю, что у вас может быть сочетание заголовков SDK в вашем включенном пути. Проверьте свой путь включения; Опция gcc «-H» поможет вам узнать, какое перемешение (если есть) происходит.

+0

Извините, но я действительно не знаю, как это сделать. Я использую кнопку компиляции среды Dev-Cpp, и я не знаю, с какими другими параметрами вызывается gcc. Кроме того, я бы, вероятно, не знал, что делать с выходом. – Jordi

+0

Я ничего не знаю о Dev-Cpp, поэтому я не могу помочь с «как». Но если и когда вы получите информацию, в худшем случае отредактируйте ее в своем вопросе, и кто-то здесь сможет помочь. –

Смежные вопросы