C预处理和C库

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C预处理和C库相关的知识,希望对你有一定的参考价值。

1 #include <stdio.h>
2 #define MAN(x) "n"##x
3 int main(void)
4 {
5     printf("%s",MAN("dd"));
6     return 0;
7 }

这里我说一下,几个我曾犯的错误,首先,将#define错写成了#include

报错error C2006: #include expected a filename, found ‘identifier‘

当我搜索时发现了这么别人问的一个问题

#include "asclass.h"
//asclass.h有语句#define ASData_i "asdata.h"
#include  ASData_i

这样编译,报错:error C2006: #include expected a filename, found ‘identifier‘

怎么处理?

因为#define 和#include都是预处理。所以不会在#include处发生替换,所以编译器误认为你在添加头文件

还有,当你在处理替换字的类型时要注意,就像上面的"n"##x,如果你去掉“”,那么他就会将n当成是个变量

指令             用途

         #            空指令,无任何效果

         #include    包含一个源代码文件

         #define     定义宏

         #undef     取消已定义的宏

         #if          如果给定条件为真,则编译下面代码

         #ifdef       如果宏已经定义,则编译下面代码

         #ifndef     如果宏没有定义,则编译下面代码

         #elif         如果前面的#if给定条件不为真,当前条件为真,则编译下面代码

         #endif      结束一个#if……#else条件编译块

         #error      停止编译并显示错误信息

    #else       略

    #error     指令将使编译器显示一条错误信息,然后停止编译。

         #line        指令可以改变编译器用来指出警告和错误信息的文件号和行号。
         #pragma  指令没有正式的定义。编译器可以自定义其用途。典型的用法是禁止或允许某些烦人的警告信息。

#pragma message(“消息文本”)

  当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。

 

条件预处理

    #if defined x
等于
    #ifdef x

    #if !defined x
等于
    #ifndef x

更详细的可以看http://www.cnblogs.com/mmfzmd517528/archive/2013/01/23/2872423.html

 

unknown character ‘0xa1‘可能是在复制粘贴时,全角半角的错误

atexit()

#include<stdlib.h>
     int atexit(void(*func)(void));
 
    其中,atexit的参数是一个函数地址,当调用此函数时无须传递任何参数,该函数也不能返回值,atexit函数称为终止处理程序注册程序,注册完成以后,当函数终止是exit()函数会主动的调用前面注册的各个函数,但是exit函数调用这些函数的顺序于这些函数登记的顺序是相反的
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 
 4 void func1(void)
 5 {
 6         printf("in func1\\n");
 7 }
 8 
 9 void func2(void)
10 {
11         printf("in func2\\n");
12 }
13 
14 void func3(void)
15 {
16         printf("in func3\\n");
17 }
18 
19 int main()
20 {
21         atexit(func3);
22         atexit(func2);
23         atexit(func1);
24 
25         printf("In main\\n");
26 
27         return 0;
28 }
结果是
  1. In main
  2. in func1
  3. in func2
  4. in func3

以上是关于C预处理和C库的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向Android 进程注入工具开发 ( Visual Studio 开发 Android NDK 应用 | Visual Studio 中 SDK 和 NDK 安装位置 )(代码片段

如何有条件地将 C 代码片段编译到我的 Perl 模块?

什么是Taglib?

使用 X-lists 和预处理器指令生成可配置的 C 代码 在编译时

[linux][c/c++]代码片段01

C预处理器和C库--1