VS 2008不自动列成员函数

今晚想敲下孙鑫的第一个代码,以前一直用VC6.0,然后换了VS 2008了,怎么不自动列出成员函数呢,在VC6.0就不自动列成员函数,这个都在选项里面设置好了自动列的,然后编译器就是不自动列成员函数,这样写代码要敲很多关键词,很多无用功,据说这个问题是因为操作系统的BUG导致的,不过还是有办法解决的,下载一个Visual Assist X,简称VAX,然后安装上,我的VC6.0是没问题了,但是VS2008还是不自动列成员函数,到底是怎么回事呢,我在选项里面设置了C/C++自动列成员函数,然后把所有的都选择了自动列成员函数了,重新启动下还是不行,可是VC6.0就可以呢。然后想想Visual Assist X是一个插件,是插入在程序里面的。
我的安装顺序是VC6.0->Visual Assist X->VS 2008 这样的话Visual Assist X插件只在VC6.0里面有了,在VS 2008里面没有这个插件。
为了证明下我的猜想,然后重新安装了下Visual Assist X,然后运行VS 2008,嗯这次果然好了,可以自动列成员函数了。
有些人所说的按ctrl+J或者ctrl+→,都是没用的,我都试过了,不过还是解决了这个问题,发上来共享一下。继续学习了,孙鑫的VC++源码我会用中文注释,然后如果有心得创意,做下,分享下代码和心得。
 

error LNK2001unresolved external symbol

今天看了下孙鑫的一个源码,第一个msg一个窗体,几个事件的API,编译就是不通过,然后重装了下VC6.0还是不行,邪门了,然后装了VS 2008,晕到,还是不行,然后百度去吧,找了一个又一个还是不行,这可咋办,先从小程序开始找到底是那里出问题了,首先编译一个例子,没问题,然后加入API函数的就编译不通过,只有几句代码而已,那是那里的问题呢,可是有些小程序就可以编译通过,提示错误要清理下BUG,或者是找找LIB库文件了,都找了,都没问题了。先发下代码:

#include <windows.h>
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
MessageBox(NULL, TEXT("Hello, Windows 98!"), TEXT("HelloMsg"), 0);
return 0;
}

就这么个简单的代码都不通过,仔细分析,以前搞的都是MIAN函数,入口点这不是不一样嘛,然后加上main函数代码:

#include <windows.h>
int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
MessageBox(NULL, TEXT("Hello, Windows 98!"), TEXT("HelloMsg"), 0);
return 0;
}
void main()
{
}

嗯嗯,ok了,这样就可以通过了,可是这不是我要的程序,所以要修改下环境配置了,我也是看以为高手贴出来的,才成功搞定的,下面分享下拉。

一,问题描述
error LNK2001: unresolved external symbol _WinMain@16
debug/main.exe:fatal error LNK 1120:1 unresolved externals
error executing link.exe;

二,产生这个问题可能的原因
1. 你用vc建了一个控制台程序,它的入口函数应该是main, 而你使用了WinMain.
2.? 你用vc打开了一个.c/.cpp 文件,然后直接编译这个文件,这个文件中使用了WinMian而不是main作为入口函数。vc这时的默认设置是针对控制台程序的。

三, 解决方法
1.进入project->setting->c/c++, 在category中选择preprocessor,在processor definitions中删除_CONSOLE, 添加_WINDOWS
2.进入project->setting->Link, 在Project options中将 /subsystem:console改为/subsystem:windows.
3.保存设置,Rebuild All.
VS2005中的设置请参考对应项进行设置

四,VS2005中的设置

1.菜单中选择 Project->Properties, 弹出Property Pages窗口
2.在左边栏中依次选择:Configuration Properties->C/C++->Preprocessor,然后在右边栏的Preprocessor Definitions对应的项中删除_CONSOLE, 添加_WINDOWS.
3.在左边栏中依次选择:Configuration Properties->Linker->System,然后在右边栏的SubSystem对应的项改为Windows(/SUBSYSTEM:WINDOWS)
4.Rebuild All. Ok ?
测试:(环境:vs2005,编程语言vc)

1.用文本编辑器编写如下代码:

// test.c
#include <windows.h>
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR???? lpCmdLine,
int?????? nCmdShow)
{
MessageBox(NULL, "Hello!", "title", MB_OK);
}

假设把文件包存为test.c.
2.用vs2005建一个Win32 Console Application, 注意在Application Settings设置为Empty project. 然后把test.c添加到工程中去。
3.vs2005建立的工程默认是支持UNICODE的,我不用这个,所以在菜单中选择 Project->Properties, 弹出Property Pages窗口。在左边栏中依次选择:Configuration Properties->General,然后把右边栏的Character Set 改为Use Multi-Byte Character Set.
4.编译,出现如下错误:
MSVCRTD.lib(crtexe.obj) : error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup
C:\test\Debug\test.exe : fatal error LNK1120: 1 unresolved externals
5.按照上述VS2005中的设置方法进行设置,然后再编译,错误消失了吧!
 

VC学习心得

以下是学习VC++初级记录的笔记,感觉重点的记录了一下,同时与大家分享一下,希望对大家的学习有帮助。

1.构造函数与析构函数特点:
都没有返回值
析构函数不能带有参数,而且只有一个
2.continue与break语句
continue返回循环体,break结束跳出循环体
continue与switch结合,break与for,while等循环使用
3.栈和堆的区别
栈由程序控制(函数参数),用完后将被释放//先进后出,不产生磁盘碎片
堆由程序员控制,由程序员编写程序确定释放时间,程序结束时,可能由操作系统回收//易产生磁盘碎片,存储量大
4.指针:可以为空;可以被赋值;
引用:不能为空;只可以初始化。
5.构造函数的执行顺序是由成员列表的初始化决定的;->->自上而下顺序;
析构函数的执行顺序也是由成员列表初始化决定;<-<-<-自下而上顺序。
6.对象必须{对象类 对象}新建了实例才可以用。
7.栈中空间比较小,只有2M,堆的上线是由系统有效的虚拟内存来定的,因此获得的空间比较大。
8.类的定义是class A 不是class A(),在main()函数前,必须先声明,main中调用,main后定义。
9.单一继承格式: class 子类: (继承方式) 父类
一个变量在内存只有一个地址,不能赋值set=set是错误的。
10.公有派生的前提下:基类的保护成员被派生类继承过来以后仍然是保护成员。
11.继承方式:
public:全局继承方式;
private:局部内部继承方式;
protected:保护方式,可以访问,但是不可以修改;
12.派生类指针是不允许指向基类对象的,同理基类的引用可以做为派生类对象的别名,但是反过来则不行,派生类的引用不可以做为基类对象的别名。
13.单一继承:只有一个基类;
多重继承:拥有多个基类。
14.在虚函数中不使用指针就无法实现动态联编。
15.茂国:父类中的虚方法(就是我们说的抽象方法),只要在子类中实现了就是重写
16.茂国:普通成员函数也可以被重写,但是不建议这样做,因为没有意义,好的设计模式不会更改父类的非virtual函数。
 

帮老师做的C精华试题

1.? 有以下程序

#include <stdio.h>
main()
{ char s[]={“012xy”};? /*定义数组S*/
int i,n=0;??? /*声明变量是整型,并给n赋值*/
for(i=0;s[i]!=0;i++)?? /*判断如果是s[i]!=0则继续循环 下面的判断语句*/
if(s[i]&gt;=’a’&amp;&amp;s[i]&lt;=’z’) n++;? /*判断是否是在小写a到z之间第一个从0开始所以判断到了x的时候n已经过去了0,1,2三次了,到x了,n停止累加,所以输出的是2*/
printf(“%d\n”,n);
}

程序运行后的输出结果是(B)
A)0
B)2
C)3
D)5
2.? 有以下程序

#include
main()
{ int n=2,k=0;? /*声明整型变量n和k并赋值*/
while(k++&amp;&amp;n++&gt;2);? /*? 循环 条件 也就是括号里面部分如果为真的话就继续循环否则退出循环第一个循环是 k++ 这时k=K+1?? 解释一下K++和++K的区别,K++是先赋值后使用,++K 是先使用后赋值,去编译器运行一下就可以见效果了,在这里K输出的是 1 不是0 ,具体自己去编译器领悟,然后 &amp;&amp; 和后面部分, 循环条件如果N++&gt;2就退出循环,n的初始值是2,这时N++ 已经符合退出条件了,就在这里停止循环*/
printf(“%d %d\n”,k,n);
}

程序运行后的输出结果是(D)
A)0 2
B)1 3
C)5 7
D)1 2
3. 有以下程序

#include
void fun(int p) /* 自定义过程,void 无返回值类型函数*/
{ int d=2;
p=d++; printf(“%d”,p);}
main()/* 主函数*/
{ int a=1;
fun(a); /* 调用自定义过程*/ printf(“%d\n”,a);}

程序运行后的输出结果是(C)? /*? a独占一个地址,d 独占一个地址,地址的值结合不是简单的相加*/
A)32
B)12
C)21
D)22
4.设有以下函数
void fun(int n,char * s) {……}
则下面对函数指针的定义和赋值均是正确的是(A)
A)void (*pf)(); pf=fun; /* 前面部分是返回函数的指针,后面部分是给函数指针赋值,注意给函数指针赋值不是简单变量赋值,不能给指针变量赋地址例D选项就是错误的*/
B)viod *pf(); pf=fun; /* 这里就要看做是*(pt())指针运算符的优先级最高,这部分的意思是这个函数的返回值是指针,所以明显的后面fun函数不能直接给指针变量赋值了。。。*/
C)void *pf(); *pf=fun; /* 跟B选项一样,不能把函数直接赋给指针变量*pt */
D)void (*pf)(int,char);pf=&fun; /* 这里上面解释了不能给函数指针赋 地址*/

5. 有以下程序

#include
#define f(x) x*x*x /* 宏定义*/
main()
{ int a=3,s,t;
s=f(a+1);t=f((a+1));
printf(“%d,%d\n’,s,t);
}

/* 第一次a=3 ,s=(3+1*3+1*3+1)= 10,t =f(4)=4*4*4=64? 所以运行以后选择答案
A */
程序运行后的输出结果是(A)
A)10,64
B)10,10
C)64,10
D)64,64
6.有以下程序

#include
struct A?? /* 定义?? 结构体 类型*/
{ int a; char b[10]; double c;};
struct A f(struct A t);
main()
{ struct A a={1001,”ZhangDa”,1098.0};
a=f(a);jprintf(“%d,%s,%6.1f\n”,a.a,a.b,a.c); /*第一个是是输出a中a数据,第二个是输出a中b的数据,第三个是a中c的数据,因为a.b 和a.c 两个成员在后面用了复制函数,所以输出该结果*/
}

struct A f(struct A t)
( t.a=1002;strcpy(t.b,”ChangRong”);t.c=1202.0;return t; )
程序运行后的输出结果是(D)
A)1001,ZhangDa,1098.0
B)1001,ZhangDa,1202.0
C)1001,ChangRong,1098.0
D)1001,ChangRong,1202.0

7.有以下程序

#include
typedef struct?? /*自定义类型*/
{ int num;double s}REC; /*初始化 变量REC*/
void fun1( REC x ){x.num=23;x.s=88.5;}
main()
{ REC a={16,90.0 };/* 实参*/
fun1(a); /*实参传递给形参*/
printf(“%d\n”,a.num);
}

程序运行后的输出结果是16

8. 以下程序的运行结果是(C)

#include "stdio.h"
main()
{struct date
{int year,month,day;}today;?? /*定义枚举类型,年月,日*, /
printf("%d\n",sizeof(struct date));/ *输出占用字节,一个整型数据占用2个字节,上面在枚举类型中定义了3个整型变量,所以这个枚举类型占用 6个字节*/
}

A)6
B)8
C)10
D)12

C给二维字符串数组参数赋值

#include "stdio.h"
#define STR_SIZE 255
//
void write_array(char str_arry[][STR_SIZE])
{
sprintf(str_arry[0], "test0");
sprintf(str_arry[1], "test1");
sprintf(str_arry[2], "test2");
}
//
int main(void)
{
char str_arry[3][STR_SIZE];
//
write_array(str_arry);
printf("str[0]: %sn", str_arry[0]);
printf("str[1]: %sn", str_arry[1]);
printf("str[2]: %sn", str_arry[2]);
exit(0);
}