欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

#if #ifdef #if define 和标识符

程序员文章站 2024-03-23 11:44:34
...

小写了一个 宏定义的程序 没想到 编译居然报错了 , 一定又忘了什么 基础的知识   --00--

程序的第一版是 酱紫的:
#if defined(ANDROID2.0)
#pragma message ("the version is android 2.0")
#elif  defined(ANDROID3.0)
#pragma message ("the version is android 3.0")
#elif  defined(ANDROID4.0)
#pragma message ("hte version is android 4.0")
#else
#pragma message ("the version not input")
#endif

{

预处理就报错:[email protected]:~/Desktop# gcc -E test.c -o test.i test.c:9:21: error: missing ')' after "defined" #if defined(ANDROID2.0)                     ^test.c:9:23: error: missing '(' in expression #if defined(ANDROID2.0) ....看了也不知道是什么问题 改来改去#if define ANDROID2.0 报错:test.c:9:21: error: missing binary operator before token ".0"#ifdef (ANDROID2.0) 报错:test.c:9:8: error: macro names must be identifiers意思是 宏定义后 要跟 标识符 :c语言中的标识符:关键字预定义标识符,用户自定义标识符------字母(A-Z,a-z)、数字(0-9)、下划线“_”组成这样就知道为什么报错了 ------2.0 的 '.' 有问题。

}

#if DEBUG #if(DEBUG) #if(DEBUG==0) 第三个是表达式 都是可以的实现: 1. 可以在预处理面前 定义宏 #define DEBUG 0       2. [email protected]:~/Desktop# gcc -E test.c -DDEBUG=0 -o test.i

#ifdef + 标识符 (不可以加 () )

#if defined + 标识符 #if defined+ (标识符) 

以上三者都可以加 #elif必须加 #endif

#ifndef _TEST_H_

#define _TEST_H_

int global;

#endif

强调一下: test.c global.h test.h 在两个.h文件里都定义 int global; 但是有上面#ifndef 这个预处理 编译时就不会报错在预处理的时候还是会文本替换到c文件 ,但是在后期会直接刷掉区别 :#pragma once ====只处理一次 如果一个地方有定义 则预处理器根本就不会把个替换进去,相对而言 更高效 但是不是所有的编译器 都支持 #pragma once