#if #ifdef #if define 和标识符
小写了一个 宏定义的程序 没想到 编译居然报错了 , 一定又忘了什么 基础的知识 --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