C语言细节1OK

1 C编译与链接

1.1 词法分析贪心法

010不等于10(前者八进制)

需要注意这种情况,有时候在上下文中为了格式对齐的需要,可能无意中将十进制数写成了八进制数,例如:

Parttab[] =
{
    046,
    047,
    125,   
};
词法分析中的贪心法:编译器将程序分解成符号的方法是:从左到有一个一个字符的读入,如果该字符可能组成一个符号,那么再读入下一个字符,判断已经读入的两个字符组成的字符床是否可能是一个符号的组成部分;如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串已不再可能组成一个有意义的符号。

1.2 命名冲突与static修饰符

1,声明与定义
每个外部变量只能定义一次。
int a;
其出现在函数体外,称为外部对象a的定义。说明a是个外部整型变量,同时为a分配了空间,初值默认为0
同一个外部变量被多次定义(在同一个源文件或多个源文件),出现命名冲突。

2,命名冲突与static修饰符
避免命名冲突: static int a;
a的作用域只限于一个源文件内,对于其他源文件不可见。因此,当多个函数共享一个外部变量,可将这些函数放于同一源文件中,并将用到的外部变量也在同一个源文件中用static声明

1.3 自定义函数与C函数库重名问题Interpositioning

C语言没有办法,所以要熟知系统函数名,尽量不要冲突。
C++等其他面向对象的语言可以通过命名空间在一定程度上解决这个问题,但命名空间也不能重名(可以嵌套)。


1.4 头文件extern c声明

《程序员的自我修养》P91相关

很多时候我们会碰到有些头文件声明了一些C语言的函数和全局变量,但是这个头文件可能会被C语言代码或C++代码包含。比如很常见的,我们的C语言库函数中的string.h中声明了memset这个函数,它的原型如下:

void *memset (void *, int, size_t);
C函数头文件string.h可能被其他C/C++程序include,其真正的string.o是由C编译器编译的。其中的memset函数被C编译器符号引用为_memset

1,如果该string.h声明如下:
//C库函数头文件:string.h
void *memset (void *, int, size_t);


结果:
include它的C文件正确。
include它的C++文件错误。

原因:
C++文件会将memset的符号修饰成_Z6memsetPvii,这样链接器就无法与C语言库中的_memset符号进行链接。

2,如果该string.h声明如下:
//C库函数头文件:string.h
extern "C" {
	void *memset (void *, int, size_t);
	}

结果:
include它的C文件错误。
include它的C++文件正确。

原因:
C语言又不支持extern “C”语法,编译错误。
C++语言支持extern,将memset的符号按C方式编译修饰成_memset。链接正确。

3,将该string.h声明如下:
//C库函数头文件:string.h
#ifdef __cplusplus
	extern "C" {
#endif
		void *memset (void *, int, size_t);
#ifdef __cplusplus
	}
#endif

结果:
include它的C文件正确。
include它的C++文件正确。

原因:
使用C++的宏“__cplusplus”,C++编译器会在编译C++的程序时默认定义这个宏,我们可以使用条件宏来判断当前编译单元是不是C++代码。
如果当前编译单元是C++代码,那么memset会在extern “C”里面被声明,按照C编译器编译为_memset;
如果当前编译单元是C代码,就直接声明。

上面这段代码中的技巧几乎在所有的系统头文件里面都被用到。

1.5 C预处理

预处理的过程主要处理包括以下过程:

将所有的#define删除,并且展开所有的宏定义
处理所有的条件预编译指令,比如#if #ifdef #elif #else #endif等
处理#include 预编译指令,将被包含的文件插入到该预编译指令的位置。
删除所有注释 “//”和”/* */”.
添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号。
保留所有的#pragma编译器指令,因为编译器需要使用它们

通常使用以下命令来进行预处理:

gcc -E hello.c -o hello.i
参数-E表示只进行预处理

1.4 头文件的命名冲突

a.c 函数定义

a.h 函数声明

这是一种习惯,在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前面加下划线,并把文件名中的“.”也变成下划线,如:stdio.h
#ifndef _STDIO_H
#define _STDIO_H
......
#endif

2 C声明与定义

2.1  自增运算符

假设a=6

++a可以作为左值(因为返回的是引用,这时a值为7)

//++a
A& operator ++ ()
{
    ++ A.data;
    return A;
}

a++不能作为左值(因为返回的是临时变量6,真正的a值为7)

//a++
A& operator ++ (int)
{
    temp = A.data;
    ++ A.data;
    return temp;
}
若临时变量
1:是基本类型(int,float,double),不能做左值
2:是你自己定义的类类型,则可以做左值

示例:

#include <stdio.h>
main(){
    int a=3,b;
    b=(++a)+(++a);
    printf("%d\n",b);
}
结果是10,可以看做:
b=(++a)+(++a);
即
++a;(最右)
++a;(左边)
b = a + a;
但是事实上ANSI C并不定义表达式运算的顺序(先算左边的++a还是右边的)

i++的副作用和顺序点:

http://www.cnblogs.com/smwikipedia/articles/1229984.html

而且也会跟实现有关,所以尽量不要做这种操作。

2.2 运算符求值顺序

C语言中只有四个运算符(&&、||、?:、,)存在规定的求值顺序。
1,运算符&&和运算符||首先对左侧操作数求值,只在需要时才对右侧操作数求值。
2,运算符?:有三个操作数:在a?b:c中&

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要使用C语言获取HTTPS页面,可以按照以下步骤进行: 1. 导入所需的库文件:在C语言中,要使用HTTPS协议获取页面,需要使用libcurl库文件。因此,首先需要下载并导入libcurl库文件。 2. 初始化libcurl:在代码中,使用curl_global_init函数来初始化libcurl,确保它可以正常工作。 3. 创建一个CURL对象:使用curl_easy_init函数创建一个CURL对象并获取其句柄。 4. 设置HTTPS选项:使用curl_easy_setopt函数来设置相关的选项,包括设置HTTPS协议、设置证书、设置请求的URL等。其中,关于HTTPS协议,适当的选项包括CURLOPT_SSL_VERIFYPEER和CURLOPT_SSL_VERIFYHOST,用于指示是否验证服务器证书和主机。 5. 发送HTTPS请求:使用curl_easy_perform函数发送HTTPS请求,并将返回的数据保存到一个字符串中。 6. 处理返回的数据:根据需要,可以对返回的数据进行处理,例如将其打印到控制台或保存到文件中。 7. 清理资源:使用curl_easy_cleanup函数清理CURL对象,并使用curl_global_cleanup函数清理libcurl。 需要注意的是,在获取HTTPS页面时,可能会遇到服务器证书无法验证、HTTPS协议的版本问题等。在实际应用中,还需要处理这些问题,并增加相应的错误处理机制。 这是一个简单的流程,当然,具体实现的细节和复杂度可能会因项目要求而有所差异。希望以上的回答能对您有所帮助。 ### 回答2: 在C语言中获取HTTPS页面,可以使用libcurl库来实现。 libcurl是一个功能强大的开源网络传输库,它能够支持多种协议,包括HTTP和HTTPS。 首先,需要在系统中安装libcurl库,并在程序中引入curl库的头文件。 以下是一个简单例子,演示了如何使用libcurl获取HTTPS页面: ```c #include <stdio.h> #include <curl/curl.h> int main(void) { CURL *curl; CURLcode res; // 初始化libcurl curl_global_init(CURL_GLOBAL_DEFAULT); // 创建一个curl句柄 curl = curl_easy_init(); if(curl) { // 设置要访问的URL curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com/"); // 设置支持SSL/TLS连接 curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); // 发送请求并获取响应 res = curl_easy_perform(curl); if(res == CURLE_OK) { printf("HTTPS请求成功!\n"); } else { printf("HTTPS请求失败:%s\n", curl_easy_strerror(res)); } // 关闭curl句柄 curl_easy_cleanup(curl); } // 清理libcurl资源 curl_global_cleanup(); return 0; } ``` 在上述例子中,首先通过`curl_global_init`函数初始化libcurl。然后,使用`curl_easy_init`函数创建一个curl句柄。接着,通过`curl_easy_setopt`函数设置要访问的URL,并设置SSL/TLS连接的验证选项。其中,`CURLOPT_SSL_VERIFYPEER`设置为0L表示不进行对等证书验证,`CURLOPT_SSL_VERIFYHOST`设置为0L表示不检查主机名证书。最后,通过`curl_easy_perform`发送请求并获取响应。 需要注意的是,由于在上述例子中关闭了SSL/TLS验证选项,因此在实际应用中需要谨慎处理安全问题,以确保HTTPS连接的安全性。 这只是一个简单的例子,libcurl还提供了更多的功能和选项,可以根据实际需求进行配置和扩展。具体可以参考libcurl的官方文档和示例代码。 ### 回答3: 在C语言中获取HTTPS页面需要进行以下步骤: 1. 首先,您需要使用C语言中的网络库(如libcurl或OpenSSL)来进行HTTPS连接。这些库提供了用于在C语言中进行网络通信的函数和方法。 2. 在程序中包含适当的头文件(如curl.h)并链接所需的库文件。这样可以确保您可以使用库中提供的函数和方法。 3. 使用库提供的函数来创建HTTPS连接。首先,您需要使用相关函数来初始化通信环境,设置连接选项和回调函数。接下来,您可以使用一个函数来发送HTTPS请求并获得服务器的响应。 4. 如果需要验证服务器的证书,您需要使用适当的函数来设置证书验证选项,并提供服务器的证书。 5. 对于HTTPS页面的获取,您可以使用库提供的函数来接收和处理服务器响应。您可以将响应存储在字符数组中,或者逐行读取响应并按需解析数据。 6. 最后,您可以关闭连接并释放任何相关资源,以确保程序的正确运行。 需要注意的是,HTTPS连接通常涉及到安全性,包括证书验证和加密通信等方面。因此,在编写C程序时,您需要确保遵守最佳安全实践,并使用适当的方法来保护您的应用程序和用户的数据安全。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值