【问题标题】:C code from gcc to Visual Studio Express 2010从 gcc 到 Visual Studio Express 2010 的 C 代码
【发布时间】:2013-04-05 14:00:41
【问题描述】:

我正在尝试移动一些我在 Visual Studio Express 2010 下使用 gcc 成功编写和编译的代码。

我有以下头文件。

#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: 'SYMBOL': 非法将此类型用作表达式

在此处描述:http://msdn.microsoft.com/en-us/library/76c9k4ah(v=vs.71).aspx

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

【问题讨论】:

  • MSVC++ 不是 C 编译器,因为它没有实现 C99 标准;它无法编译使用 C99 标准(1999 年批准;十多年前)添加的功能的有效 C 代码。解决方案:不要使用 C++ 编译器编译 C 代码。

标签: c visual-studio-2010 gcc struct


【解决方案1】:

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

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

    initSymbolTable();

    printSymbolTable();

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

【讨论】:

  • 它在 C99 中是合法的,但 MS 只支持不允许它的 C89。
【解决方案2】:

或者,您可以在解决方案资源管理器中右键单击引发错误的 .c 文件,转到 C/C++ -> 高级并将编译为设置为编译为 C++ 代码。这样您就无需编辑源代码。

【讨论】:

  • 这是正确的,它只抱怨 strdup 因为它已被弃用......无论如何我需要纯 C 代码。无论如何,谢谢。
  • @salvo:不确定您所说的pure C code 是什么意思。您的代码将保持纯 C。如果您指的是生成的二进制代码,则不应有任何实质性差异,并且您只是为 Windows 编译。
  • @RichieHindle:你能给我一个有效的 C 代码的例子吗?如果被解释为 C++,它将表现不同或无效?肯定有这样的例子,但是想不出来。
  • X *x = malloc(sizeof(X)); 是有效的 C,因为您可以从 void* 隐式转换为 X*,但它需要在 C++ 中进行显式转换。
  • 我的意思是我必须将此代码与 flex & bison 生成的代码合并。我正在用 flex 和 Bison 生成 C 代码,因为我知道它是比 C++“更稳定”的代码。所以我使用 cygwin 用 flex 和 Bison 生成代码,然后将生成的代码集成到 Visual Studio 2010 中。如果我使用 Visual Studio C++ 编译器,我会遇到很多错误。
猜你喜欢
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
相关资源
最近更新 更多