2016-07-27 2 views
0

Почему я получаю синтаксическую ошибку для моего объявления заголовка C?Синтаксис C - ошибка C2143: синтаксическая ошибка: отсутствует ')' before '*'

Вот мой файл заголовка, viterbi.h:

#ifndef VITERBI_H 
#define VITERBI_H 
void vitdec(float* , int , int , bool*); 
#endif //VITERBI_H 

А вот мой файл реализации, viterbi.c:

// viterbi.c : Defines the entry point for the console application. 
// 
#include "viterbi.h" 
#include "math.h" 
//void vitdec(float* sd, int frameLen, int rate, bool* hd); 

void vitdec(float* sd, int frameLen, int rate, bool* hd) 
{ 
    //... The rest of the function 

Ошибки компилятора чтения Visual Studio 2010:

viterbi.h(4): error C2143: syntax error : missing ')' before '*' 
viterbi.h(4): error C2081: 'bool' : name in formal parameter list illegal 
viterbi.h(4): error C2143: syntax error : missing '{' before '*' 
viterbi.h(4): error C2059: syntax error : ')' 
viterbi.h(4): error C2059: syntax error : ';' 
viterbi.c(7): error C2065: 'bool' : undeclared identifier 
viterbi.c(7): error C2065: 'hd' : undeclared identifier 
viterbi.c(7): warning C4552: '*' : operator has no effect; expected operator with side-effect 

Насколько я видел/могу сказать, это допустимый синтаксис для объявления C. Если я компилирую viterbi.c как код C++ (viterbi.cpp), то ошибки исчезают. Какова синтаксическая ошибка?

+2

Там нет такого понятия, как '' bool' в C' (89). Вы хотите скомпилировать код 'C' с помощью Visual Studio, тогда вам нужно написать код' C', а не 'C++ '. – PaulMcKenzie

+1

Похоже, что 'bool' - это, вероятно, проблема: http://stackoverflow.com/a/18042253 – jonhopkins

+0

@PaulMcKenzie:' bool' - это сопоставление макросов ** стандартного типа ** '_Bool'. и есть рекомендации не переопределять 'bool' и т. д. в приложении. И C не C89, а стандартный C, который является ** только ** C11. – Olaf

ответ

3

bool не является родным C-типом, но для тех, кто использует C99, попробуйте добавить строку #include <stdbool.h>, которая содержит макрос, который определяет bool.

Поскольку C-компилятор во всех продуктах Visual Studio/MSVC использует C89, bool не определен вообще для вас, как родной тип C или иначе. Методы обхода включают использование typedef или enum для определения bool. Примеры приведены в приведенной ниже ссылке.

Для получения дополнительной информации см: Is bool a native C type?

+1

Макрос 'bool' не является родным, но он сопоставляется с нативным типом '_Bool' в этом заголовке макросом (обязательным). Это потому, что в дикой природе существует слишком сильно написанный C-код, который определяет их собственную версию' bool' (вы можете быть удивлены, насколько креативны некоторые ppl - как определить свой собственный логический тип), поэтому вы можете использовать '_Bool' как родной тип (я не рекомендую его использовать). – Olaf

+0

@Keith Мой компилятор VS 2010 поддерживает C89/90, поэтому я должен искать anot ее решение. –

+0

@StephenWang Вот что я имею в виду, вам нужен заголовок для макроса, который Олаф объяснил, чтобы он был виден. Вы попробовали? Компиляция на ideone.com провалилась без включения и сменила его. –

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