Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从gcc到Visual Studio Express 2010的C代码_C_Visual Studio 2010_Gcc_Struct - Fatal编程技术网

从gcc到Visual Studio Express 2010的C代码

从gcc到Visual Studio Express 2010的C代码,c,visual-studio-2010,gcc,struct,C,Visual Studio 2010,Gcc,Struct,我正在尝试将我用gcc在VisualStudioExpress 2010下成功编写和编译的一些代码转移到其他地方 我有下面的头文件 #ifndef _SYMTAB_H_ #define _SYMTAB_H_ #define NHASH 997 typedef enum {NOTYPE, INTTYPE, DOUBLETYPE, STRINGTYPE} SYMBOLTYPE; typedef union { int intvalue; double doublevalue;

我正在尝试将我用gcc在VisualStudioExpress 2010下成功编写和编译的一些代码转移到其他地方

我有下面的头文件

#ifndef _SYMTAB_H_
#define _SYMTAB_H_

#define NHASH 997

typedef enum {NOTYPE, INTTYPE, DOUBLETYPE, STRINGTYPE} SYMBOLTYPE;

typedef union {
    int intvalue;
    double doublevalue;
    char *stringvalue;
} SYMBOLVALUE;

typedef struct {
    SYMBOLTYPE type;
    char *name;
    SYMBOLVALUE value;
} SYMBOL;

void initSymbolTable(void);
SYMBOL *lookup(char *sym);
SYMBOL *addIntSymbol(char *name, int value);
SYMBOL *addDoubleSymbol(char *name, double value);
SYMBOL *addStringSymbol(char *name, char *value);
char *getSymbolName(SYMBOL *sym);
int getIntSymbolValue(SYMBOL *sym);
double getDoubleSymbolValue(SYMBOL *sym);
char *getStringSymbolValue(SYMBOL *sym);
void printSymbolTable(void);

#endif
如果我使用该头文件编写一段代码,例如:

int main(int argc, char *argv[]) {
    initSymbolTable();

    printSymbolTable();

    SYMBOL *intSymbol = addIntSymbol("pippo", 10);

    printSymbolTable();

    printf("All tests successfull\n");
    return 0;
}
我得到以下错误信息:

错误C2275:“符号”:非法使用此类型作为表达式

这里描述的是:

不管怎样,我不明白这有什么不对。
我还将C/C++->Advanced下的项目属性中的“编译为”属性设置为“编译为C代码”。此外,所有文件都保存为*.c和*.h。

您不能在Visual Studio支持的c版本中声明变量mid函数。您需要在顶部声明它:

int main(int argc, char *argv[]) {
    SYMBOL *intSymbol;

    initSymbolTable();

    printSymbolTable();

    intSymbol = addIntSymbol("pippo", 10);
    ...

不能在Visual Studio支持的C版本中声明变量mid函数。您需要在顶部声明它:

int main(int argc, char *argv[]) {
    SYMBOL *intSymbol;

    initSymbolTable();

    printSymbolTable();

    intSymbol = addIntSymbol("pippo", 10);
    ...

可选地,您可以右键单击在解决方案资源管理器中引发错误的.c文件,转到C/C++ + >高级,并将编译设置为C++代码编译。这样你就不需要编辑你的源代码了。< /P> < P>,你可以右键点击在解决方案资源管理器中抛出错误的.c文件,转到C/C++ +高级,然后编译编译为C++代码。这样你就不需要编辑你的源代码了。

它在C99中是合法的,但MS只支持C89,这是不允许的。它在C99中是合法的,但MS只支持C89,这是不允许的。这是正确的,它只抱怨strdup,因为它被弃用了……无论如何,我需要纯C代码。谢谢。@salvo:不知道你说的纯C代码是什么意思。您的代码将保持纯C。如果您是生成的二进制代码,则不应该有任何实质上的差异,而您只不过是编写Windows的。@ RieieHeeld:您能给我一个有效C代码的例子吗?如果它被解释为C++,那么它会有不同的行为,还是无效?我肯定有这样的例子,但想不出任何例子。
X*X=malloc(sizeof(X))是有效的C,因为您可以从 Value*>代码>隐式地转换为 X*< /Cl>,但是它需要一个明确的C++类型,我必须将这个代码与Flex和ByEN生成的代码合并。我用Flex和BySe生成C代码,因为我知道它是“更稳定”的代码,然后是C++。因此,我使用cygwin使用flex和Bison生成代码,然后在VisualStudio2010中集成生成的代码。如果我使用VisualStudioC++编译器,我会有很多错误。这是正确的,它只会抱怨STRUP,因为它被弃用了……无论如何,我需要纯C代码。谢谢。@salvo:不知道你说的纯C代码是什么意思。您的代码将保持纯C。如果您是生成的二进制代码,则不应该有任何实质上的差异,而您只不过是编写Windows的。@ RieieHeeld:您能给我一个有效C代码的例子吗?如果它被解释为C++,那么它会有不同的行为,还是无效?我肯定有这样的例子,但想不出任何例子。
X*X=malloc(sizeof(X))是有效的C,因为您可以从 Value*>代码>隐式地转换为 X*< /Cl>,但是它需要一个明确的C++类型,我必须将这个代码与Flex和ByEN生成的代码合并。我用Flex和BySe生成C代码,因为我知道它是“更稳定”的代码,然后是C++。因此,我使用cygwin使用flex和Bison生成代码,然后在VisualStudio2010中集成生成的代码。如果我使用VisualStudioC++编译器,我会有很多错误。MSVC++不是C编译器,因为它没有实现C99标准;它无法编译使用C99标准(于1999年批准;十多年前批准)添加的功能的有效C代码。解决方案:不要使用C++编译器编译C代码。MSVC ++不是C编译器,因为它没有实现C99标准;它无法编译使用C99标准(于1999年批准;十多年前批准)添加的功能的有效C代码。解决方案:不要使用C++编译器编译C代码。