**说明:**之所以整理如下内容,是因为看个别代码时偶尔会遇到,虽不常用,但确实有点烦。
/***************我是转载线************/
参考1:https://www.jianshu.com/p/070a23d1a32d
参考2:https://blog.csdn.net/iteye_5392/article/details/82613715
参考3:http://c.biancheng.net/view/159.html
参考4:http://c.biancheng.net/view/455.html
一、你没用过的宏定义
- #line
编译器会在警告消息、错误消息与调试信息中包含代码所在的行号与所在的源文件名,并提供给调试工具。你可以在源代码中利用 #line 命令改变编译器默认指定的文件名与行号信息。#line 命令的语法如下:
#line line_number [“filename”]
例子:#line 1200 "primary.c"
- #warning
警告不会影响程序的正常运行
例子:#waring "我只是一个人为的警告!"
- #error
程序运行到此抛出错误:
例子:#error "错误在此,休想编过!"
- #pragma
#pragma 命令是向编译器提供额外信息的标准方法,如果 #pragma 之后的第一个标记(token)是 STDC,那么该命令就是一个标准 pragma。否则,该 #pragma 命令的作用取决于实现版本。为了保障代码的可移植性,应该尽量少使用 #pragma 命令。
如果预处理器支持所指定的标记,就会执行这些标记所代表的动作,或者把该信息传递给编译器。如果预处理器不支持所指定的标记,就忽略该 #pragma 命令。
例如,最新版本的 GNU C 编译器和微软 Visual C 编译器都支持 #pragma pack(n),它使得编译器让结构成员对齐到特定的字节边界。下面的例子使用 pack(1)指示每个结构成员必须对齐到字节边界:
#if defined( __GNUC__ ) || defined( _MSC_VER )
#pragma pack(1) // 对齐字节,没有填充
#endif
二、你没用过的偏门语法
- case 可以位于if-else 内部
2)数组名和下标可以互换 , arr[index] 等于 index[arr]
- 在非常规的位置使用#include
myHead.txt 中内容:(“I Love you”)
4)%*d 用在scanf 里面可以忽略input
三、你没用过的printf
问题1,输出一个字符串,但最多只输出5个 (比如向mysql中插入字符串,显然有个最大长度限制)
问题2,输出一个字符串,但该字符串占100个位置,如果不足,输出空格(即左对齐,右对齐)
问题3,输出一个字符串,只输出其前5个,并且占100个位置
+,-用于对齐,%A.Bs,表示占A格,但输出B个字符。
结合*号,非常强大。%.*s可以实现如下功能:通过外部传入参数限定字节数。
#include <stdio.h>
int main(int argc,char* argv[])
{
printf("%.5s OK\n","HELLO WORLD");
printf("%-5.2s OK\n","HELLO WORLD");
printf("%+5.2s OK\n","HELLO WORLD");
printf("%*s OK\n",5,"HELLO WORLD");
printf("%-*s OK\n",100,"HELLO WORLD");
printf("%*s OK\n",100,"HELLO WORLD");
printf("%+*s OK\n",100,"HELLO WORLD");
return 0;
}
运行结果:
[root@localhost wx]# ./a.out
HELLO OK
HE OK
HE OK
HELLO WORLD OK
HELLO WORLD OK
HELLO WORLD OK
HELLO WORLD OK
%x、%X、%#x、%#X 的区别:
# include <stdio.h>
int main(void)
{
int i = 47;
printf("%x\n", i);
printf("%X\n", i);
printf("%#x\n", i);
printf("%#X\n", i);
return 0;
}
运行结果:
2f
2F
0x2f
0X2F