У меня есть кусок кода, который автоматически генерирует этот компилятор в Linux, но не в Windows с помощью Visual Studio 2008 Express. Проблема, с которой я сталкиваюсь, заключается в том, что я не понимаю ошибку компилятора. Я не думаю, что могу опубликовать точный код, так что вот его дезинфицированная версия.

Сообщается об ошибке для строки, объявляющей статическую константу DELETE. Примечание. Ошибка компилятора не отображается при компиляции этого файла — он успешно создается в библиотеке, но отображается во втором проекте, который включает заголовок (косвенно). Я считаю, что есть хотя бы один или два других проекта, которые косвенно включают это решение — у них нет проблем с компиляцией.

Сама константа появляется только в одном месте (когда я просматриваю проект для выражения DELETE):

Сообщается об ошибке error C2059: syntax error : ‘constant’ (за ней следуют error C2258: illegal pure syntax, must be ‘= 0’ и error C4430: missing type specifier — int assumed. Note: C++ does not support default-int , которые, как я предполагаю, не актуальны), но не тогда, когда скомпилированные выше файлы.

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

Комментируя строку, генерирующую ошибку, делает сборку работы в Windows (и не работает в Linux, но я предполагаю, что комментирование ее коллеги в ifndef должно исправить это), но я действительно хочу знать, почему компилятор терпит неудачу эта конкретная строка и то, что на самом деле означает ошибка. Кроме того, вероятно, лучше не изменять код, который был автоматически сгенерирован.

EDIT: . Разделение терминов на отдельные строки делает компилятор точкой DELETE. Может быть, макрос автоматически определяется с именем DELETE где-то?

РЕДАКТИРОВАТЬ 2: Убрал раздел заголовка немного, чтобы устранить некоторые возможные заблуждения. Кстати, переименование переменной DELETE также устраняет ошибку.

РЕДАКТИРОВАТЬ 3: Ясно, что мне нужно больше узнать о VS -/P, генерирует предварительно обработанный файл без создания объектного файла, поэтому сборка, конечно же, завершится без генерирования ошибок компиляции. Кроме того, похоже, что там есть макрос, который определяет DELETE как (0x00010000L).

Я просмотрел другие посты и, честно говоря, я до сих пор не уверен, что является причиной проблемы. Я программирую в Visual Studio и

У меня есть следующий код: (это главный C)

Он использует следующий код cpp:

С соответствующим заголовочным файлом:

Но я продолжаю получать следующие ошибки:

Пожалуйста, могу ли я получить некоторую помощь, я смотрел на другие сообщения, касающиеся c2059, но до сих пор не получается

Решение

Измени свой exec декларация об использовании EXTERNC макрос, который вы постарались определить.

Другие решения

Я столкнулся с этой ошибкой компиляции при добавлении enum к проекту. Оказалось, что одно из значений в enum определение имело конфликт имени с препроцессором #define ,

enum выглядело примерно так:

А потом в другом месте был #define со следующим:

Затем в .cpp где-то еще в проекте оба заголовка были включены:

Поскольку имя kUnknown уже #define когда компилятор пришел к kUnknown символ в моем enum , он сгенерировал ошибку, так как символ уже использовался для определения строки. Это вызвало загадку syntax error: ‘string’ что я видел.

Это было невероятно запутанным, поскольку в enum определение и компилируется просто отлично.

Это не помогло, что это было в очень большом проекте C ++, и что #define был транзитивно включен в совершенно отдельный блок компиляции и был написан кем-то 15 лет назад.

Очевидно, что правильная вещь отсюда переименовать это ужасное #define к чему-то менее распространенному, чем kUnknown , но до тех пор, просто переименовав enum значение для чего-то другого работает как фикс, например:

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

extern «C» используется для указания компилятору сделать его грамматикой языка Си, но вы имеете в виду объявить внешнюю функцию exec. Вы просто объединяетесь с этим. поэтому переписайте ваш код следующим образом в arp_piping.h:

и затем префикс extern «C» в файле cpp.
если вы хотите компилировать их с грамматикой C, просто установите в cpp вызов функции exec, поэтому напишите так:

Синтаксическая ошибка: "token" syntax error : ‘token’

Маркер привел к синтаксической ошибке. The token caused a syntax error.

В следующем примере создается сообщение об ошибке для строки, которая объявляет j . The following example generates an error message for the line that declares j .

Чтобы определить причину ошибки, проверьте не только строку, указанную в сообщении об ошибке, но и строки над ней. To determine the cause of the error, examine not only the line that’s listed in the error message, but also the lines above it. Если проверка строк не дает каких либо сведений о проблеме, попробуйте закомментировать строку, указанную в сообщении об ошибке, и, возможно, несколько строк выше. If examining the lines yields no clue about the problem, try commenting out the line that’s listed in the error message and perhaps several lines above it.

Если сообщение об ошибке возникает в символе, который сразу же следует за переменной typedef , убедитесь, что переменная определена в исходном коде. If the error message occurs on a symbol that immediately follows a typedef variable, make sure that the variable is defined in the source code.

C2059 возникает, когда имя символа препроцессора повторно используется в качестве идентификатора. C2059 is raised when a preprocessor symbol name is re-used as an identifier. В следующем примере компилятор видит DIGITS.ONE как число 1, которое недопустимо в качестве имени элемента enum: In the following example, the compiler sees DIGITS.ONE as the number 1, which is not valid as an enum element name:

Вы можете получить C2059, если символ равен Nothing, как это может произойти, если для компиляции используется символ /d = . You may get C2059 if a symbol evaluates to nothing, as can occur when /Dsymbol= is used to compile.

Еще один случай, когда может произойти C2059, — при компиляции приложения, которое указывает структуру в аргументах по умолчанию для функции. Another case in which C2059 can occur is when you compile an application that specifies a structure in the default arguments for a function. Значение аргумента по умолчанию должно быть выражением. The default value for an argument must be an expression. Список инициализаторов, например тот, который использовался для инициализации структуры, не является выражением. An initializer list—for example, one that used to initialize a structure—is not an expression. Чтобы устранить эту проблему, определите конструктор для выполнения необходимой инициализации. To resolve this problem, define a constructor to perform the required initialization.

Следующий пример приводит к возникновению ошибки C2059: The following example generates C2059:

C2059 может возникать при неправильном приведении. C2059 can occur for an ill-formed cast.

Следующий пример приводит к возникновению ошибки C2059: The following sample generates C2059:

C2059 также может возникнуть при попытке создать имя пространства имен, содержащее точку. C2059 can also occur if you attempt to create a namespace name that contains a period.

Следующий пример приводит к возникновению ошибки C2059: The following sample generates C2059:

C2059 может возникать, если за оператором, который может определить имя ( :: , -> и . ), следует ключевое слово template , как показано в следующем примере: C2059 can occur when an operator that can qualify a name ( :: , -> , and . ) must be followed by the keyword template , as shown in this example:

По умолчанию C++ предполагается, что AY::Rebind не является шаблоном. Таким образом, следующий интерпретируется как знак "меньше". By default, C++ assumes that AY::Rebind isn’t a template; therefore, the following is interpreted as a less-than sign. Компилятор должен явно сообщить, что Rebind является шаблоном, чтобы он мог правильно проанализировать угловую скобку. You must tell the compiler explicitly that Rebind is a template so that it can correctly parse the angle bracket. Чтобы исправить эту ошибку, используйте ключевое слово template в имени зависимого типа, как показано ниже: To correct this error, use the template keyword on the dependent type’s name, as shown here: