omatase
omatase

Reputation: 1711

C Program Won't Compile in Visual Studio 2010

I have a simple C program that I can compile via command line on Linux easily enough but want to use Visual Studio to debug the program so that I can more easily see what it's doing but I cannot get it to compile.

I have created a new cpp Win32 console application. Added my .c and .h file but I cannot get it to compile. I get 100+ errors that primarily seem to be red herrings. For instance I have an error saying a variable isn't declared when I can see it declared on the line immediately before. For instance:

int i;
for (i = 0; i < unpacked_length; i++)
{

on the "for" line I get an error: "error C2065: 'i' : undeclared identifier"

So something else is obviously going on. One error that seems legit is this one:

static unsigned char* Base64_Charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

IntelliSense: a value of type "const char *" cannot be used to initialize an entity of type "unsigned char *"

Since this works when compiling via command line I don't know why the intellisense would be giving this error here unless this compiler has different rules than the other one I used via command line. I haven't done any C for about 15 years and don't know if this could be a difference in compiler or if there is something else going on here.

The only includes in the source are:

#include "dtcrypt.h"
#include <string.h>
#include <stdlib.h>

Appreciate any help!

Upvotes: 0

Views: 3310

Answers (3)

vikramjitSingh
vikramjitSingh

Reputation: 59

Instead of messing up with compiler settings typecast it to "unsigned char *"

E.g. : unsigned char* Base64_Charset = (unsigned char *)"ABCDEFG";

Upvotes: 0

Adam Rosenfield
Adam Rosenfield

Reputation: 400274

Visual Studio 2010 only supports ANSI C (aka C89), it does not support the more modern C99 or C11 language standards. ANSI C requires you to declare all of your variables at the top of a function, you cannot define them in the middle of a function just before they are used. So try rewriting your code like this:

void my_function()
{
    /* Variable declarations go here */
    int i;
    ...

    /* Now teh codez */
    for (i = 0; i < unpacked_length; i++)
    {
        ...
    }
}

For the second error, Intellisense complaining that it can't convert a pointer to const char to a pointer to const unsigned char. String literals have type char[] (array of characters), and char is signed by default. So, you should declare your variable as type const char * instead of const unsigned char *. Or, you can ignore it, since it's not a compiler error, but it is a warning at certain warning levels.

Upvotes: 3

Seva Alekseyev
Seva Alekseyev

Reputation: 61351

Whether char is signed or not is a compiler setting in Visual C++. Change it to unsigned to match the expected GCC environment. Project properties, C/C++, Language.

As for i in the loop, there must be some extra info that you're not showing. The two pasted lines look kosher to me.

That said, I have ample experience porting code between VC++ and GCC - it's hardly ever pretty.

Upvotes: 1

Related Questions