博文
电子表(2006-04-19 11:03:00)
摘要:#define _CRT_SECURE_NO_DEPRECATE // 仅VC++2005才需要这个宏
#include <iostream>
#include <iomanip>
#include <ctime>
#include <cassert>
#include <conio.h>
#include <windows.h>
using namespace std;
#pragma comment( lib, "Winmm" ) // 如果是dev-cpp, 手工在连接器中加入 libwinmm.a 文件路径,比如 C:/Dev-Cpp/lib/libwinmm.a
void __stdcall timecallback( UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2 )
{
time_t t = time( 0 );
tm* lt = localtime( &t );
SetConsoleCursorPosition( GetStdHandle(STD_OUTPUT_HANDLE), *(COORD*)dwUser );
cout << setw(4) << setfill('0') << right << ( 1900 + lt->tm_year ) << '/'
<< setw(2) << setfill('0') << right << ( 1 + lt->tm_mon ) << '/'
&n......
count_of 之 宏实现 和 模板实现 的比较(2006-03-21 10:29:00)
摘要:count_of 的作用是编译时静态获取数组元素数目,C中必须使用宏实现:
#define count_of(a) (sizeof(a)/sizeof(a[0]))
C++中还可以使用模板实现:
template<typename T,size_t N> inline size_t count_of( T (&)[N] ) { return N; }
宏实现的优点是:C和C++均可使用
模板实现优点是:可以禁止掉不合法的应用
C宏实现的事例代码:
#include <stdio.h>
#define count_of(a) (sizeof(a)/sizeof(a[0]))
int main( void )
{
char a[12];
int b[3][4];
char* p = 0;
printf( "%u\n", count_of(a) ); // 输出12
printf( "%u\n", count_of(b) ); // 输出3
printf( "%u\n", count_of(p) ); // 用法错误,但编译时却无法检测出来
}
C++模板实现的事例代码:
#include <iostream>
template<typename T,size_t N> inline size_t count_of( T (&)[N] ) { return N; }
int main( void )
{
char a[12];
int b[3][4];
char* p = 0;
std::cout << count_of(a) << std::endl; // 输出12
&......
立此存照 01(2005-06-28 13:24:00)
摘要:
主题:关于寄存器变量~
--------------------------------------------------------------------------------
楼主 shengaa
用寄存器变量的目的是为了提高运行速度,但是在用之前要先判断CPU寄存器是否有空,那么这个判断不是也额外增加了开销了么?? 这样运行速度不是等于没有提高么?? 不解~~~
--------------------------------------------------------------------------------
第1楼 bruceteen
呵呵,是编译时判断的。
--------------------------------------------------------------------------------
第2楼 shengaa
既然是编译时判断的,那生成可执行程序后,在运行时不是还要判断寄存器是否有空闲的么,不会在程序运行时就不判断了吧?就直接根据编译时判断的结果----把变量放在寄存器或者内存中?? 要是在编译的时候 寄存器有空,在运行可执行程序的时候,寄存器没空,那怎么办??
--------------------------------------------------------------------------------
第3楼 euclid
可能编译器隐藏了一些代码,如果不空则原寄存器的内容进栈保存先~象汇编
--------------------------------------------------------------------------------
第4楼 shengaa
所以说运行时还是要做出额外的开销的嘛
这样不就违背了用寄存器变量的原意了么
--------------......
献给这个论坛上的C/C++初学者(2005-06-25 15:32:00)
摘要:献给programfan论坛上的C/C++初学者
一. C、C++以及C#的关系
1. C++虽然主要是以C的基础发展起来的一门新语言,但她不是C的替代品,不是C的升级,C++和C是兄弟关系。
没有谁比谁先进的说法,更重要的一点是C和C++各自的标准委员会是独立的,最新的C++标准是C++98/2003年修订,最新的C标准是C99。
因此也没有先学C再说C++的说法,也不再(注意这个"不再")有C++语法是C语法的超集的说法。
2. C++/CLI 和 C# 是微软的,它们与C和C++没有任何关系,虽然部分语法相似。
但哪两种语言不相似呢?都是abc这26个字母。
二. 编译器的选择
3. 不要使用TC/TC++/BC/CB等古老的编译器来学习C/C++,因为它们太古老了,不支持新的C/C++标准。
不要使用CBX/VC++6.0/VC2003等对C/C++标准支持不好的编译器,虽然这些编译器适合工作,但不适合学习,因为它们中的语法陷阱很多。
我推荐的编译器是 gcc/mingw。
三. 学C/C++,而不是学编译器
4. 不要用""代替<>来包含系统头文件。
使用 "" 则意味着告诉别人,这个文件不是标准库的,而是存放于工程目录下自己的文件。
对于 #include <iostream> 按缺省理解为包含C++的标准文件iostream
对于 #include "iostream" 按缺省理解为包含一个存在于当前工程目录下的文件iostream,这个自定义的iostream文件应该与标准的iostream文件不同,否则为什么不用 #include <iostream> ?
事实上,更严重的是,#include "标准库" 其行为是由编译器定义的,只有 #include <标准库> 才是C/C++标准规定的标准库接口。如果你 #include "标准库" 形式可能有如下三种错误:
a. 报某某文件不存在,因为C/C++标准只规定 #include <标准库> 后就可以使用相应函数,而并没有规定这个文件一定需要实际存在,所以使用 #include "标准库" 形式必然出错;
b. 编译报错,理由同上,编译器可能为 #i......
