版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaoxu2050/article/details/82897341
ANSI C标准中有几个标准预定义宏
- __func__:在源代码中插入当前所在函数名;
- __LINE__:在源代码中插入当前源代码行号;
- __FILE__:在源文件中插入当前源文件名;
- __DATE__:在源文件中插入当前的编译日期
- __TIME__:在源文件中插入当前编译时间;
- __cplusplus:编译C++程序该标识符被定义。
前面几个(func...TIME)常用于printf/sprintf等打印语句中:
//输出日期、时间、源文件名、所在行
//Data-Time:Sep 29 2018 11:55:19 FileName:test.cpp Line:31
printf("Data-Time:%s %s FileName:%s Line:%d\n", __DATE__, __TIME__,
__FILE__, __LINE__);
//cpp文件会被编译成c++的格式__cplusplus
//c文件只有使用gcc编译时才不会定义__cplusplus,如果使用g++编译则会定义
#ifdef __cplusplus
printf("__cplusplus exist\n");
#else
printf("__cplusplus not exist\n");
#endif
__cplusplus常用于头文件中使用:
#ifndef _ZX_FUNC_H
#define _ZX_FUNC_H
#ifdef __cplusplus
extern "C" {
#endif
/* functions */
char *strdup (const char *s);
#ifdef __cplusplus
}
#endif
#endif
上段代码中的strdup()函数使用C编译时,会转译成_STRDUP()标识。如果使用C++编译,C++存在多态的概念,函数会被转译中_STRDUP_CHAR()标识。因为这个不同,在C++代码中如果直接调用C编译的函数会找不到函数了,这时就需要extern “C” 了。 extern"C"会告诉C++编译器引用的函数或变量是C编译的,名字是不一样的,你要找....,问题就解决了。
在C++中调用C的代码,需要注意两点:
- 被调用方,即C中的函数或变量声明为extern类型
- 调用方,即C++中将函数或变量用extern "C"修饰。
启用宏
声明宏有两种方法,一是通过#define命令,这需要修改源代码的,二是在Makefile中使用-D编译选项设置,参考下面的代码:
g++ test.cpp -o test -D __DEBUG
//通过“-D __DEBUG”开关灵活控制启用不同的代码
#ifdef __DEBUG
printf("in Debug\n");
#elif
printf("in Release\n");
#endif