【问题标题】:Can't find my syntax error, VC++ says there's one找不到我的语法错误,VC++ 说有一个
【发布时间】:2010-02-12 12:50:27
【问题描述】:

我在这里遇到了一点问题,我在搞乱机器代码和函数指针,而我的一些代码 VC++ 只是拒绝编译。

这完全按预期编译和运行:

#include <stdlib.h>
#include <stdio.h>

int main()
{
    char tarr[] = {0xb8, 222, 0, 0, 0, 0xc3};

    int (*testfn)() = tarr;

    printf("%d", testfn()); // prints 222

    getchar();
}

但是,Visual C++ Express 不会编译以下代码,并给出以下错误:error C2143: syntax error : missing ';' before 'type'

#include <stdlib.h>
#include <stdio.h>

int main()
{
    char* tarr = (char*) malloc(1000);
    tarr[0] = 0xb8;
    tarr[1] = 222;
    tarr[2] = 0;
    tarr[3] = 0;
    tarr[4] = 0;
    tarr[5] = 0xc3;

    int (*testfn)() = tarr; // syntax error here

    printf("%d", testfn());

    getchar();
}

我查看了所谓的错误代码,但我看不出它有什么问题。这是怎么回事?我有什么遗漏吗?

【问题讨论】:

  • 使用 Visual Studio 2008 第一个版本无法编译:错误 C2440:'initializing':无法从 'char [6]' 转换为 'int (__cdecl *)(void)'
  • @sergiom 这很奇怪 - 第一个 sn-p 在 VC++ 2008 Express 中对我来说编译得很好

标签: c visual-c++ function-pointers syntax-error


【解决方案1】:

这是 C 代码吗?如果是这样,并且它不是 C99,那么您需要将 testfd 的声明移到分配给 tarr[X] 之前。

【讨论】:

  • 太棒了,这很有效。我不知道我必须这样做,所以我很惊讶第一个 sn-p 编译。
  • 第一个片段对于 C
  • 我实际上并不确定哪个 C 标准 VC++ 正在编译它,我确定它会将其视为 C 代码,而不是 C++
【解决方案2】:

代码在 GCC 中编译时出现警告,而在 G++ 中编译失败。你错过了那条线上的演员表。您还缺少 main 的返回值。

    int (*testfn)() = (int (*)()) tarr; // no more syntax error?

【讨论】:

  • 演员表并没有真正的区别,返回值也没有。
  • 是的:警告是有原因的。在某些架构上,函数指针与数据指针的大小不同。我总是用 -Wall 编译。 G++ 实际上称它为错误,所以我猜 C++ 在这方面比 C 更严格。那你的问题。
  • 不同的指针大小不是这里唯一的问题 - 放置堆栈和/或堆的内存区域可能另外被标记为不可执行
  • 啊,好的。就我而言,我将其作为一个小实验进行,但如果我需要针对不同的架构,我一定会牢记这一点。
  • @Christoph 我知道 - 我已经关闭了这个项目的 NX 支持等
猜你喜欢
  • 2015-12-17
  • 2018-03-14
  • 1970-01-01
  • 2015-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多