C/C++基础学习教程2014-11-25 15:18:27

( 4人已投票,[高质量] )
分享:
31.3K

1.C/C++基础学习教程

1.1: 遇到问题怎么解决

A 论坛的精华区也有相应的讨论,许多可以直接解决你的问题,也可以GOOGLE查找,并看看精华区。 如果已找了GOOGLE并看了精华区,或是在国内一些论坛上查找相应的解决方案比如CSDN、ITEYE、OSCHINA等,雪炭网SnowCoal.com也可能有你想要的内容,需要了解的内容见雪炭搜索

   好了下面开始学习C/C++一些知识:

1.2STL string 怎么转换大小写

A:使用STL算法中的transform 函数

代码:


  string str22 = "This IS a MiXed CaSE stRINg";

  transform (str22.begin(),str22.end(), str22.begin(), tolower);


1.3: 怎样生成动态库

A:创建步骤:

首先创建object文件,这个文件将加入通过gcc –fPIC 参数命令加入到共享函数库里面。PIC的意思是位置无关代码Position Independent Code)。下面是一个标准的格式:

代码:


gcc -shared -Wl,-soname,your_soname -o library_name file_list library_list


下面再给一个例子,它创建两个object文件(a.ob.o),然后创建一个包含a.ob.o的共享函数库。例子中”-g”Wall”参数不是必须的。

代码:


gcc -fPIC -g -c -Wall a.c

gcc -fPIC -g -c -Wall b.c

gcc -shared -Wl,-soname,liblusterstuff.so.1 -o liblusterstuff.so.1.0.1 a.o b.o -lc


下面是一些需要注意的地方:

· 不用使用-fomit-frame-pointer这个编译参数除非你不得不这样。虽然使用了这个参数获得的函数库仍然可以使用,但是这使得调试程序几乎没有用,无法跟踪调试。

· 使用-fPIC来产生代码。 使用shared 说明生成动态库,使用soname说明生成的库名

· 某些情况下,使用gcc 来生成object文件,需要使用“-Wl,-export-dynamic”这个选项参数。通常,动态函数库的符号表里面包含了这些动态的对象的符号。这个选项在创建ELF格式的文件时候,会将所有的符号加入到动态符号表中。可以参考ld的帮助获得更详细的说明。

star3s补充:

对于C++程序要使用EXTERN “C”说明输出接口

代码:


  extern "C"

  {

    int soTest(int a,int b) ;

  }

  int soTest(int a,int b)

  {

    return a+b;

  }


1.4:怎样指定程序链接某个库的动态库或静态库版本

A:使用Bdynamic-Bstatic选项。默认情况下,假如共享库可用,连接器会使用共享库。但是-Bdynamic-Bstatic提供了很好控制库的方法。它们可以决定用共享库还是用静态库。

-Bdynamic-Bstatic选项给连接器,如下操作:

# gcc -o main main.o -Wl,-Bstatic \

-lfoo -Wl,-Bdynamic -lbar

# gcc -o main main.o -Wl,-Bstatic

告诉连接器所有的库(libc等等)都使用静态的版本。

1.5: 请问各UNIX平台下和编译器名

kaisakaisa

sun CC (c++) ccc

alpha cxx(c++) cc(c)

HP aCC(c++)

IBM xlC (c++)

1.6: solaris下有没有C函数可以获得进程的相关信息

比如:进程名、进程pid、进程所占CPU/Memory、开始时间、运行状态等等。谢谢。

liupch:2003-03-19 10:03

读取/proc/进程号/psinfo这个文件。

就用我告诉你的那个函数

ioctl(fd, PIOCPSINFO, &procinfo);

在看一下procinfo这个结构就知道了。

1.7: c++下使用<iostream>的问题

c++下使用include <iostream>后为什么编译器会报错呢

1.检查你是不是使用g++编译器编译。gccc++程序会有问题

2.检查在include 头文件后有没有使用using namespace std;

新的标准C++加了几个关键字,其中最常用的就是namespace(名字空间)

加入这个关键字是为了避免在大程序中符号名重定义问题

同时原来的标准c++类都包含在std 名字空间中(如果使用c++ 的标准函数库,<cstdio> 那么它们也在std名字空间中)

新的标准c++头文件没有 .h,所以当你们include它们时要注意使用std名字空间.

以下一个例子

代码:


#nclude <iostream>

#include <string>

using namespace std;  //include 所有标准c++头文件后

main()

{

   cout<<"hello world"<<endl;

}


1.8 :volatile的作用是什么

volatile的本意是易变的

由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。

一般说来,volatile用在如下的几个地方:

1、中断服务程序中修改的供其它程序检测的变量需要加volatile

2、多任务环境下各任务间共享的标志应该加volatile

3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;

另外,以上这几种情况经常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在1中可以通过关中断来实现,2中可以禁止任务调度,3中则只能依靠硬件的良好设计了。

简单点:

就是该变量会以编译器无法预知的方式发生变化,请编译器不要做优化(所有的编译器的优化均假设编译器知道变量的变化规律)

1.9: 请问,用 gcc ld 连接程序时,如何设置段的属性?

幽灵兵:

为了实现共享数据,这个方法要比其它 进程/线程 的数据同步方法更

快,更方便,更灵活,而且是所有方法中最简单的。

比如我在 Win 下这样做:

1. 创建个 DLL 专门用于数据交换

2. DLL 中声明一个全局变量 Var1

3. 在连接时声明 .bss 段为共享段

( Vc Linker: /section:.bss,S | Gcc: [type] Var1 __attrbiute__ ((section("shared"), shared)); )

4. 在需要这个变量的进程中调用这个 DLL

... ...

其实就是将这个DLL作为一种数据池... 难道你们没用过吗?

我想将 .bss 段设置为 共享,gcc NT 下可以用:

int Var __attrbiute__ ((section("shared"), shared));

Linux/UNIX 下怎么办呢?

JohnBull :2003-04-27

Linux系统并不强调的使用,因为Linux的设计者考虑到这个OS将移植到包括RISC等多种平台上,而事实上只有IntelCPU才强调的概念,其他(包括大多数64位)系统都是基于进行设计的。

Linux中,请用共享内存。

//接下来的是数据库编程





头像

snowcoal
  • C/C++
  • C语言学习
  • C/C++学习教程

收藏到我的私密空间

标题:C/C++基础学习教程

作者:柳岸花明

你暂未登录,请登录后才可收藏至您的私密空间 确认取消
雪炭网

键盘操作 更便捷 -雪炭网雪中送炭-乐趣无限