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 指令将使编译器显示一条错误信息,然后停止编译。
#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()
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 }
结果是
- In main
- in func1
- in func2
- in func3
以上是关于C预处理和C库的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向Android 进程注入工具开发 ( Visual Studio 开发 Android NDK 应用 | Visual Studio 中 SDK 和 NDK 安装位置 )(代码片段