使用gcc编译的代码将无法在visual studio 2012中编译

时间:2013-01-19 22:00:47

标签: c visual-studio-2012

我对程序编程很陌生,所以我不确定我的代码是不好的还是我在Visual Studio中做错了什么。

所以我有一些代码可以打印一个整数,在内存中打印它的位置,通过内存改变它的值,然后打印新的整数以及它在内存中的位置。

它使用gcc在cmd中编译并运行良好,但在Visual Studio中则不行。

#include <stdio.h>

int main(){
    int a = 4;
    printf("Integer is: %d\n", a);
    printf("Integer is stored at: %p in memory\n", a);
    int *pointer = &a;
    *pointer = 3;
    printf("Integer is now: %d at %p in memory\n",a,*pointer);
    getchar();
    return 0;
}   

Visual Studio在尝试编译和运行时给出了这些错误:

  

第9行:错误C2065:'指针':未声明的标识符

     

第9行:错误C2100:非法间接

     

第11行:错误C2065:'指针':未声明的标识符

     

第11行:错误C2100:非法间接

4 个答案:

答案 0 :(得分:5)

Visual Studio C编译器不支持C99,特别是能够在块中的任何位置声明变量。 GCC支持C语言的几个修订版。 IIRC,传入-std = c89作为gcc的标志也会标记这些。

答案 1 :(得分:2)

我认为您应首先在函数顶部声明变量,当您使用%p打印内存地址时,应该给出要打印的变量的地址

试试这个

int main()
{
    int a = 4;
    int *pointer=&a;
    printf("Integer is: %d\n", a);
    printf("Integer is stored at: %p in memory\n",&a);
    *pointer = 3;
    printf("Integer is now: %d at %p in memory\n",a,pointer);
    getchar();
    return 0;
}

答案 2 :(得分:1)

printf("Integer is stored at: %p in memory\n", a); 您需要将a的地址视为&a

printf("Integer is now: %d at %p in memory\n",a,*pointer); 您无需取消引用pointer即可获取地址。 使用pointer,而不是*pointer

如果您正在使用C89(我认为)或更旧的编译器进行编译,则必须将指针声明移动到块的顶部。您不能在旧C中的代码中间声明变量。

答案 3 :(得分:1)

使用VS2012 / C你需要添加块才能做你想做的事,遗憾的是编译器不支持中间的声明

int main(){
    int a = 4;
    printf("Integer is: %d\n", a);
    printf("Integer is stored at: %p in memory\n", a);
    {
      int *pointer = &a;
      *pointer = 3;
      printf("Integer is now: %d at %p in memory\n",a,*pointer);
    }
    getchar();
    return 0;
}  

或者您可以强制通过在文件上指定/TP开关将.c文件编译为.cpp文件。