Вопрос

У меня проблема с простым включенным файлом.

Включаемый файл находится в двух программах MFC, одна из которых является dll, и она также компилируется в DLL, отличную от mfc.

Недавно я использовал более крупную dll, которая оборачивается вокруг Источник из библиотеки dll меньшего размера, когда я хотел получить доступ к некоторым функциям исходного кода, которые не доступны в библиотеке dll большего размера.

Поскольку это был тест, я просто добавил исходный код в свой проект и вызвал функции.Я получил эту ошибку: синтаксическая ошибка :отсутствует ')' перед ';'

Файл включен правильно, и у меня есть как .cpp, так и .h в исходной папке и в проекте, но он не будет скомпилирован.

В конце концов я создал очень маленький тестовый проект, main.cpp , spooler.cpp и spooler.h (спулер - это оболочка для сообщений) и попытался его скомпилировать.Та же проблема.

Поэтому я удалил все материалы, связанные с dll, на случай, если с этим возникнет странная проблема, и он по-прежнему не будет компилироваться.

Я ни за что в жизни не могу придумать, что со мной не так.У кого-нибудь еще есть какие-нибудь идеи?

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

Это было полезно?

Решение

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

Другие советы

Создайте с использованием параметра /P, который создаст предварительно обработанный файл (обычно с расширением .i).

В Visual Studio эта опция будет находиться в свойствах проекта в разделе что-то вроде:

C/C++  -  Preprocessor  -   Generate Preprocessed File

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

Без источника трудно быть точно уверенным в том, что происходит.Из первой части вашего вопроса кажется, что этот конкретный код корректно компилируется в проекте, где он был впервые использован, но когда вы включаете его в свой второй проект, он больше не компилируется.Если это так, вы хотите посмотреть, какие другие заголовки включены перед этим.Иногда, если имена вашей функции или переменных совпадают с именами, определенными в другом заголовке, особенно windows.h, то вы можете получить ошибки из кода, который ранее был скомпилирован без проблем.

Если этот код имеет никогда скомпилировано правильно, тогда другие ответы, предлагающие вам проверить открытие / закрытие "(" вероятно, это то место, с которого можно начать.

Ваш компилятор должен сообщить вам, в какой строке была ошибка.Попробуйте выполнить поиск предыдущего "(" до конца этой строки.

Вам нужно выяснить, к чему все расширяется.В частности, что такое ID_SPOOLER_EVENT?Если в нем несбалансированные скобки, это ваш виновник.Если нет, что ж, последуйте совету Майка Б.Для меня это выглядит как проблема с препроцессором.

Код, который используется:

// the only two includes
#include <windows.h>
#include "spooler.h"
// in WinMain
// create window then...
ShowWindow (hwnd, iCmdShow);
UpdateWindow (hwnd);

SpoolerInitiallize( hwnd, ID_SPOOLER_EVENT ); // <-- our function
...

И да, я знаю, что оно написано неправильно, и слово initialise также неправильно написано во всей документации.К сожалению, это не может быть изменено, поскольку мы также предоставляем эту dll третьим лицам.

Попробовать что Майк Б сказано с помощью препроцессора.

Это предложение напомнило мне, почему эта ошибка выглядела такой знакомой.Для меня это был очень короткий #define это была замена имени переменной на литерал int или что-то в этом роде.Противный.

Запустив код через предварительный процессор, я узнал, что происходит.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top