博文

C/C++ 宏带来的奇技淫巧(转)(2011-12-05 19:04:00)

摘要:众多C++书籍都忠告我们C语言宏是万恶之首,但事情总不如我们想象的那么坏,就如同goto一样。宏有
一个很大的作用,就是自动为我们产生代码。如果说模板可以为我们产生各种型别的代码(型别替换),
那么宏其实可以为我们在符号上产生新的代码(即符号替换、增加)。 关于宏的一些语法问题,可以在google上找到。相信我,你对于宏的了解绝对没你想象的那么多。如果你
还不知道#和##,也不知道prescan,那么你肯定对宏的了解不够。 我稍微讲解下宏的一些语法问题(说语法问题似乎不妥,macro只与preprocessor有关,跟语义分析又无关): 1. 宏可以像函数一样被定义,例如:
   #define min(x,y) (x<y?x:y) //事实上这个宏存在BUG
   但是在实际使用时,只有当写上min(),必须加括号,min才会被作为宏展开,否则不做任何处理。
  
2. 如果宏需要参数,你可以不传,编译器会给你警告(宏参数不够),但是这会导致错误。如C++书籍中所描
   述的,编译器(预处理器)对宏的语法检查不够,所以更多的检查性工作得你自己来做。 3. 很多程序员不知道的#和##
   #符号把一个符号直接转换为字符串,例如:
   #define STRING(x) #x
   const char *str = STRING( test_string ); str的内容就是"test_string",也就是说#会把其后的符号
   直接加上双引号。
   ##符号会连接两个符号,从而产生新的符号(词法层次),例如:
   #define SIGN( x ) INT_##x
   int SIGN( 1 ); 宏被展开后将成为:int INT_1; 4. 变参宏,这个比较酷,它使得你可以定义类似的宏:
......

阅读全文(2520) | 评论:1

C++特化模板静态成员变量初始化(2011-12-05 15:20:00)

摘要:template<typename T>
struct TFSS
{
    static const char* FMT;
};
template<typename T>
const char* TFSS<T>::FMT = "%s"; template<>
struct TFSS<char>
{
    static const char* FMT;
};
template<>
const char* TFSS<char>::FMT = "%hu"; template<>
struct TFSS<unsigned char>
{
    static const char* FMT;
};
template<>
const char* TFSS<unsigned char>::FMT = "%hd";   代码编译出错 error C2998: “const char *TFSS<char>::FMT”: 不能是模板定义
error C2998: “const char *TFSS<unsigned char>::FMT”: 不能是模板定义 修改成如下代码 template<typename T>
struct TFSS
{
    static const char* FMT;
};
template<typename T>
const char* TFSS<T>::FMT = "%s"; template<>
struct TFSS<char><......

阅读全文(3651) | 评论:0

pthread_setaffinity_np(2011-11-19 09:32:00)

摘要:http://www.thinkingparallel.com/2006/08/18/more-information-on-pthread_setaffinity_np-and-sched_setaffinity/   More information on pthread_setaffinity_np and sched_setaffinity If you're new here and like what you read, you may want to subscribe to my RSS blog feed or free email updates. Thanks for visiting! Skimming through the activity logs of this blog, I can see that many people come here looking for information about pthread_setaffinity_np. I mentioned it briefly in my article about Opteron NUMA-effects, but barely touched it because I had found a more satisfying solution for my personal use (taskset). And while I do not have in depth knowledge of the function, maybe the test programs I wrote will be of some help to someone to understand the function better. I will also post my test program for sched_setaffinity here while I am at it, simply because the two offer similar functionality. Problem description Short recap: The problem both functions are trying to solve is ......

阅读全文(5223) | 评论:0

SetThreadAffinityMask设置使用多核CPU的哪个核心(2011-11-19 09:27:00)

摘要:MSDN上的描述:
C++代码 SetThreadAffinityMask    The SetThreadAffinityMask function sets a processor affinity mask for the specified thread.       DWORD_PTR SetThreadAffinityMask(      HANDLE hThread,      DWORD_PTR dwThreadAffinityMask    );   SetThreadAffinityMask The SetThreadAffinityMask function sets a processor affinity mask for the specified thread. DWORD_PTR SetThreadAffinityMask( HANDLE hThread, DWORD_PTR dwThreadAffinityMask );
Parameters
hThread
[in] Handle to the thread whose affinity mask is to be set.
This handle must have the THREAD_SET_INFORMATION and THREAD_QUERY_INFORMATION access rights. For more information, see Thread Security and Access Rights.

dwThreadAffinityMask
[in] Affinity mask for the thread.
Windows Me/98/......

阅读全文(3443) | 评论:0

sort的第三个参数(2008-08-21 13:24:00)

摘要:sort的第三个参数,一直是用仿函数,没有想到用函数指针也可以! sort的第三个参数可以用函数指针也可以用仿函数。
用函数指针如下:
bool str_cmp(const string& first, const string& second)
{
return first.compare(second) < 0 ? true: false;
}
int main(int argv, char* argc[])
{
vector<string> vString;
char str[100];
int i = 0;
while(cin>>str)
{
  vString.push_back(str);
  i++;
}
sort(vString.begin(), vString.end(), str_cmp);
for(i = 0; i < 100; ++i)
  cout<<vString[i].c_str()<<endl;
CreateTree(vString);
DeleteTree();
return 0;
}
以上将字符串非递减排序......

阅读全文(2178) | 评论:0

精确得到系统时间(2008-08-21 13:22:00)

摘要:系统时间精确得到很不容易呀,函数名够长的! 精确得到系统时间#include <windows.h>
#include <iostream>
int main(int argv, char* argc[])
{
  LARGE_INTEGER t1,t2,feq;
  QueryPerformanceFrequency(&feq);//每秒跳动次数
  QueryPerformanceCounter(&t1);//测前跳动次数
  for(int i = 0;i<10000;i++);
  QueryPerformanceCounter(&t2);//测后跳动次数
  double d=((double)t2.QuadPart-(double)t1.QuadPart)/((double)feq.QuadPart);//时间差秒
  std::cout<<d<<std::endl;
}......

阅读全文(1887) | 评论:0

时间函数解析(2008-08-21 13:20:00)

摘要:对于c的时间函数,又能知道多少呢? 时间函数解析
ftime()         获取当前时间,并将其保存在结构体timeb中
localtime()     将time_t转换成结构体tm

#include <stdio.h>
#include <time.h>
#include <sys/timeb.h>

int main()
{
    struct timeb tp;
    struct tm    *tm;

    ftime(&tp);
    tm = localtime(&( tp.time ));

    printf("%02d:%02d:%02d:%03d\n",
            (tm->tm_hour),
            (tm->tm_min),
            (tm->tm_sec),
            (tp.millitm ));

timeb
--------------------------------------------<......

阅读全文(2922) | 评论:0

对控制台的操作(2008-08-21 13:19:00)

摘要:怎么样对控制台光标进行控制呢? SetConsoleCursorInfo 设置控制台光标大小 否 是 是
SetConsoleCursorPosition 设置控制台光标位置 否 是 是
SetConsoleCtrlHandler 设置控制台进程的单个句柄 否 是 是
SetConsoleWindowInfo 设置控制台窗口大小 否 是 是
SetConsoleTitle 设置控制台窗口标题字符串 否 是 是
SetConsoleCP 设置控制台输入代码页 否 是 是
SetConsoleMode 设置控制台输入输出模式 否 是 是
SetConsoleOutputCP 设置控制台输出代码页 否 是 是


示例如下:
int main(int argv, char* argc[])
{
HANDLE hCout;
COORD point;
char ch;
hCout = GetStdHandle(STD_OUTPUT_HANDLE);
while(cin>>ch>>point.X>>point.Y)
{
  SetConsoleCursorPosition(hCout, point);
  cout<<ch<<endl;
}
return 0;
} 本文标签:......

阅读全文(2362) | 评论:0

substr(取子串)(2008-08-21 13:14:00)

摘要:c里面居然没有取子串的函数,这不是给老师出题的机会吗?
char * substr(char *string, int start , int end){
int len = strlen(string);
    if(end > len) {
  end = len;
}

if(start < 0) {
  start = len + start;
  if(start < 0) {
   start = 0;
  }
}

if(end <= 0) {
  end = len + end;
  if(end < start) {
   end = len;
  }
}
if(start > end || start < 0) {
  start = 0;
}
char * substring = (char *) malloc(strlen(string)+1);
strncpy(substring, &string[start], end);
return substring;
}......

阅读全文(3222) | 评论:0