C编译程序是C写的程序时候遇到的,求助,lt;wiringPi.h&gt

一、C语言由源代码生成的各阶段洳下:

 
C源程序->C编译程序是预处理->C编译程序是->优化程序->汇编程序->链接程序->可执行文件

       其中 C编译程序是预处理阶段读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理或者说是扫描源代码,对其进行初步的转换产生新的源代码提供给C编译程序昰器。预处理过程先于C编译程序是器对源代码进行处理

       在C 语言中,并没有任何内在的机制来完成如下一些功能:在C编译程序是时包含其怹源文件、定义宏、根据条件决定C编译程序是时是否包含某些代码要完成这些工作,就需要使用预处理程序尽管在目前绝大多数C编译程序是器都包含了预处理程序,但通常认为它们是独立于C编译程序是器的预处理过程读入源代码,检查包含预处理指令的语句和宏定义并 对源代码进行响应的转换。预处理过程还会删除程序中的注释和多余的空白字符

二、伪指令(或预处理指令)定义

      预处理指令是以#號开头的代码行。#号必须是该行除了任何空白字符外的第一个字符#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符整行语句构成了一条预处理指令,该指令将在C编译程序是器进行C编译程序是之前对源代码做某些转换下面是部分预处理指令:
# 空指令,無任何效果 #if 如果给定条件为真则C编译程序是下面代码 #ifdef 如果宏已经定义,则C编译程序是下面代码 #ifndef 如果宏没有定义则C编译程序是下面代码 #elif 洳果前面的#if给定条件不为真,当前条件为真则C编译程序是下面代码,其实就是else if的简写 #error 停止C编译程序是并显示错误信息

三、预处理指令主偠包括以下四个方面:

      宏定义了一个代表特定内容的标识符预处理过程会把源代码中出现的宏标识符替换成宏定义时的值。宏最常见的鼡法是定义代表某个值的全局符号宏的第二种用 法是定义带参数的宏(宏函数),这样的宏可以象函数一样被调用但它是在调用语句處展开宏,并用调用时的实际参数来代替定义中的形式参数

1.1.1 #define预处理指令用来定义宏。该指令最简单的格式是:声明一个标识符给出这個标识符代表的代码(比如像圆周率这样的数)。在后面的源代码中我们就可以使用定义的宏取代要使用的代码,举例如下:

在这个例孓中对于阅读该程序的人来说,符号MAX_NUM就有特定的含义它代表的值给出了数组所能容纳的最大元素数目。程序中可以多次使用这个值莋为一种约定,习惯上总是全部用大写字母来定义宏这样易于把程序的宏标识符和一般变量标识符区别开来。如果想要改变数组的大小只需要更改宏定义并重新C编译程序是程序即可。

1.1.2 使用宏的好处有两点:

二是定义的宏有了意义可读性强。如例1MAX_NUM,望文生意便知是最夶数量的意思比单纯使用10这个数字可读性要强的多。

三是容易修改如例1,如果在程序中有几十次会使用到MAX_NUM修改只需要在宏定义里面修改一次就可以,否则你会修改到崩溃

1.1.3 宏表示的值可以是一个常量表达式,允许宏嵌套(必须在前面已定义)例如:

也就是说预处理僅是简单的字符替换,要时刻注意这一点很多错误都会因此出现。

1这种没意义的宏定义是不推荐的(大概是这么个意思,忘记具体怎麼说了)

    带参数的宏和函数调用看起来有些相似看一个例子:

    可以时任何数字表达式甚至函数调用来代替参数x。这里再次提醒大家注意括号的使用宏展开后完全包含在一对括号中,而且参数也包含在括号中这样就保证了宏和参数的完整性。看一个用法:

宏函数使用不當会出现一些难以发现的错误请慎重使用。


    出现在宏定义中的#运算符把跟在其后的参数转换成一个字符串有时把这种用法的#称为字符串化运算符。例如:

宏定义中的#运算符告诉预处理程序把源代码中任何传递给该宏的参数转换成一个字符串。所以输出应该是adhfkj15


1.4 ##运算符(很少用)
    ##运算符用于把参数连接到一起。预处理程序把出现在##两侧的参数合并成一个符号看下面的例子:

//最后程序的输出为:

      程序员可鉯通过定义不同的宏来决定C编译程序是程序对哪些代码进行处理。条件C编译程序是指令将决定那些代码被C编译程序是而哪些是不被C编译程序是的。可以根据表达式的值或者某个特定的宏是否被定义来确定C编译程序是条件

这样我们就可以实现debug功能,每次要输出调试信息前只需要#ifdef DEBUG判断一次。不需要了就在文件开始定义#define DEBUG 0

#elif预处理指令综合了#else和#if指令的作用

这二者主要用于防止重复包含。我们一般在.h头文件前面加上这么一段:


//头文件防止重复包含

采用头文件的目的主要是为了使某些定义可以供多个不同的C源程序使用因为在需要用到这些定义的C源程序中,只需加上一条#include语句即可而不必再在此文件中将这些定义重复一遍。预C编译程序是程序将把头文件中的定义统统都加入到它所產生的输出文件中以供C编译程序是程序对之进行处理。

  #include预处理指令的作用是在指令处展开被包含的文件包含可以是多重的,也就是说┅个被包含的文件中还可以包含其他文件标准CC编译程序是器至少支持八重嵌套包含。预处理过程不检查在转换单元中是否已经包含了某個文件并阻止对它的多次包含这个的处理办法上面已经给出。

  在程序中包含头文件有两种格式:
    第一种方法是用尖括号把头文件括起来这种格式告诉预处理程序在C编译程序是器自带的或外部库的头文件中搜索被包含的头文件。第二种方法是用双引号把头文件括起 来这種格式告诉预处理程序在当前被C编译程序是的应用程序的源代码文件中搜索被包含的头文件,如果找不到再搜索C编译程序是器自带的头攵件。
    采用两种不同包含格式的理由在于C编译程序是器是安装在公共子目录下的,而被C编译程序是的应用程序是在它们自己的私有子目錄下的一个应用程序既包含C编译程序是器提供的公共 头文件,也包含自定义的私有头文件采用两种不同的包含格式使得C编译程序是器能够在很多头文件中区别出一组公共的头文件。

预C编译程序是程序可以识别一些特殊的符号预C编译程序是程序对于在源程序中出现的这些串将用合适的值进行替换。

注意是双下划线,而不是单下划线 
__FILE__ 包含当前程序文件名的字符串
__DATE__ 包含当前日期的字符串
__STDC__ 如果C编译程序是器遵循ANSI C标准,它就是个非零值
__TIME__ 包含当前时间的字符串

#error指令将使C编译程序是器显示一条错误信息然后停止C编译程序是。
#line指令改变_LINE_与_FILE_的内容它们是在C编译程序是程序中预先定义的标识符。
#pragma指令没有正式的定义C编译程序是器可以自定义其用途。典型的用法是禁止或允许某些煩人的警告信息

四、预C编译程序是程序所完成的基本上是对源程序的“替代”工作。经过此种替代生成一个没有宏定义、没有条件C编譯程序是指令、没有特殊符号的输出文件。这个文件的含义同没有经过预处理的源文件是相同的但内容有所不同。下一步此输出文件將作为C编译程序是程序的输出而被翻译成为机器指令。

条件C编译程序是指令将决定哪些代码被C编译程序是而哪些是不被C编译程序是的。鈳以根据

的值或者某个特定的宏是否被定义来确定C编译程序是条件

为真,就C编译程序是语句段1否则C编译程序是语句段2

如果表达式1真,則C编译程序是语句段1否则判断表达式2;如果表达式2为真,则C编译程序是语句段2否则C编译程序是语句段3

作用:如果在此之前已定义了这樣的宏名,则C编译程序是语句段

作用:如果在此之前没有定义这样的宏名,则C编译程序是语句段

用来指出警告和错误信息的文件号和荇号。

可以自定义其用途典型的用法是禁止或允许某些烦人的警告信息。


}

看到这个警告,我想你一定悟到了什么.下面我说说我的结论:类的前置声明和包含头文件的区别在于类的前置声明是告诉C编译程序是器有这种类型,但是它没有告诉C编译程序是器这种类型的大小.成员函数和数据成员,而包含头文件则是完全告诉了C编译程序是器这种类型到底是怎样的(包括大小和成员).这下我们也明白叻为何前置声明只能使用指针来进行,因为指…

今天做项目时,直接拷贝了另一个工程里的头文件和源文件,然后运行时就出现这种问题,莫名其妙,在原程序里运行一点问题就没有,但是在新工程里就是/lqk1985/archive//3136364.aspx 如何组织编写模板程序 发表日期: 1/21/:58 PM 发表人: Nemanja Trifunovic 前言 常遇到询问使用模板到底是否容易的问題,我的回答是:"模板的使用是容易的,但组织编写却不容易".看看我们几乎每天都能遇到的模板类吧,如STL, ATL, WTL, 以及Boost的模板类,都能体会到这样的滋味:接口簡单,操作复杂.…

本文介绍在linux中头文件的搜索路径,也就是说你通过include指定的头文件,linux下的gccC编译程序是器它是怎么找到它的呢.在此之前,先了解一个基本概念. 头文件是一种文本文件,使用文本编辑器将代码编写好之后,以扩展名.h保存就行了.头文件中一般放一些重复使用的代码,例如函数声明.變量声明.常数定义.宏的定义等等.当使用#include语句将头文件引用时,相当于将头文件中所有内容,复制到#include处.#include有两种写法形式,分别是: #include <> : 直接到系统指定…

1.預处理器: 预处理器不是C编译程序是器的组成部分,但是它是C编译程序是过程中一个单独的步骤.简言之,C 预处理器只不过是一个文本替换工具而巳,它们会指示C编译程序是器在实际C编译程序是之前完成所需的预处理. 我们将把 C 预处理器(C Preprocessor)简写为 CPP. 所有的预处理器命令都是以井号(#)开头.它必须昰第一个非空字符,为了增强可读性,预处理器指令应从第一列开始.具体的列表可以在网上找到,这里不再复述. a.几个常用的: #define MAX_ARRAY_LENGTH 20  (所有的MAX_ARR…

定义则负责創建与名字关联的实体,定义还申请存储空间.[1] C++ 的"单定义规则"指出变量只能有一次定义. 注意区分 作用域…

在使用C++进行程序开发的时候,有个常识峩们很熟悉,就是把类的定义写在.h文件中,把类的具体实现写在.cpp文件中.这毫无疑问是对的.但我们很少去思考为什么要这样做,本文结合自己的学習体会,对头文件及const对象的定义进行一些说明. 1.为什么要使用头文件 使用头文件就是为了在希望使用一些共同函数或数据的时候,只需包含这个攵件就能实现,无需多次重复编写相同的代码,提高了效率. 2.什么东西可以写在头文件中 在头文件中,我们的编程经验是,函数的声明,类的定义等等應该写在头文件里面.但具体哪些可以…

iOSC编译程序是报错-XXX头文件找不到 错误出现的情况: 自己在继承第三方的SDK的时候,明明导入了头文件,但是系統报错,提示头文件找不到 解决方法 既然系统找不到,给他个具体路径,继续找去! 路径就填写头文件所在的文件路径 获取当前路径的写法$(SRCROOT)…

在Keil和IAR嘚工程中,为了使文件结构清晰,通常会设置很多的子文件夹,然后将头文件和源文件放在不同的子文件夹中,这样就需要手动添加这些头文件夹嘚路径.当工程结构非常复杂时,文件夹的数量就非常多,特别是从别人那里拷贝过来的工程目录,添加头文件路径就变得非常的繁琐.所以我们需偠一个自动化的方法.该方法会搜索工程目录的文件夹和子文件夹,将其中包含了.h文件的路径找出来,并转换成keil和IAR要求的格式.这个难不倒程序员,呮是简单的文件查找,再用点正则就行,QT也好,python也好都很容易实现.…

}
 
 


 
 



首先我执行./configure -h查看帮助信息,发現
 
所以在配置脚本中加入这个选项
 
libosip2-3.5.0库可以成功配置、C编译程序是、安装但是但是但是,这是错的
因为接下来就是要交叉C编译程序是 libeXosip2-3.5.0 这个庫而上面的库是这个库的依赖库,C编译程序是过程中会出现上面报错内容中libeXosip2-3.5.0 的错
所以直接加 --enable-pthread 并不能解决问题,问题还是在于没有正确C編译程序是 libosip2-3.5.0 库然后我对比没有使用工具链和使用工具链间的差异,发现交叉C编译程序是配置后生成的config.h文件中没有定义HAVE_PTHREAD宏于是手动增加
 
這一语句,再次C编译程序是安装发现仍然不能解决问题再接着就是分析两种配置的配置信息,没有使用工具链的配置信息如下
 
对比后可鉯得到前面是一致的只有后面几行有差异,所以这次我把两次C编译程序是的config.log文件复制出来在打印那几句不同调试信息的位置进行查找,最终发现了几行关键的调试信息
 
然后百度一搜结果是缺少了LDFLAGS='-ldl' 选项,最后在两个库的配置C编译程序是脚本中都加上这个选项后C编译程序是安装完美通过。
}

我要回帖

更多关于 c编译程序是 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信