NDK02_C:宏、宏函数和内联函数

NDK宏与内联函数精讲
本文深入探讨了NDK开发中的宏定义和内联函数应用,讲解了宏的文本替换特性、宏函数的优缺点及陷阱,以及内联函数的工作模式和自定义sprintf函数实现。

NDK开发汇总

一 宏

预处理器是一个文本替换工具

宏就是文本替换

//宏一般使用大写区分
//宏变量
//在代码中使用 A 就会被替换为1
#define A 1
//宏函数
#defind test(i) i > 10 ? 1: 0

//其他技巧
// # 连接符 连接两个符号组成新符号
#define DN_INT(arg) int dn_ ## arg
DN_INT(i) = 10;
dn_i = 100;

// \ 换行符
#define PRINT_I(arg) if(arg) { \
 printf("%d\n",arg); \
 }
PRINT_I(dn_i);

//可变宏
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,"NDK", __VA_ARGS__);

//陷阱
#define MULTI(x,y)  x*y
//获得 4
printf("%d\n", MULTI(2, 2));
//获得 1+1*2  = 3
printf("%d\n", MULTI(1+1, 2));

二 宏函数

​ 优点:

​ 文本替换,每个使用到的地方都会替换为宏定义。

​ 不会造成函数调用的开销(开辟栈空间,记录返回地址,将形参压栈,从函数返回还要释放堆

​ 栈。)

​ 缺点:

​ 生成的目标文件大,不会执行代码检查

三 内联函数

​ 和宏函数工作模式相似,但是两个不同的概念,首先是函数,那么就会有类型检查同时也可以debug
在编译时候将内联函数插入。

不能包含复杂的控制语句,while、switch,并且内联函数本身不能直接调用自身。
如果内联函数的函数体过大,编译器会自动的把这个内联函数变成普通函数。

拓展:手写sprintf

根据可变参数、指针运算等知识自己实现 sprintf 函数(只实现 %d 就行)!

ld: error: undefined symbol: __aarch64_ldadd8_acq_rel >>> referenced by memory:3450 (/ndk/android-ndk-r25c/sources/cxx-stl/llvm-libc++/include/memory:3450) >>> /opt9/zhangxilun/IAC2328_AIFRC/build/android/jni/output/libs/local/arm64-v8a/objs/vivo_aifrc/./__/__/__/src/algo/vivoAIFRC_post.o:(aifrcAlgo_post::process(aifrcAlgo_post::inputParam)) >>> referenced by memory:3450 (/ndk/android-ndk-r25c/sources/cxx-stl/llvm-libc++/include/memory:3450) >>> /opt9/zhangxilun/IAC2328_AIFRC/build/android/jni/output/libs/local/arm64-v8a/objs/vivo_aifrc/./__/__/__/src/algo/vivoAIFRC_post.o:(aifrcAlgo_post::process(aifrcAlgo_post::inputParam)) >>> referenced by memory:3450 (/ndk/android-ndk-r25c/sources/cxx-stl/llvm-libc++/include/memory:3450) >>> /opt9/zhangxilun/IAC2328_AIFRC/build/android/jni/output/libs/local/arm64-v8a/objs/vivo_aifrc/./__/__/__/src/algo/vivoAIFRC_post.o:(aifrcAlgo_post::process(aifrcAlgo_post::inputParam)) >>> referenced 83 more times ld: error: undefined symbol: __aarch64_ldadd8_relax >>> referenced by memory:3439 (/ndk/android-ndk-r25c/sources/cxx-stl/llvm-libc++/include/memory:3439) >>> /opt9/zhangxilun/IAC2328_AIFRC/build/android/jni/output/libs/local/arm64-v8a/objs/vivo_aifrc/./__/__/__/src/util/opencl_context.o:(air::opencl::OpenclContext::allocateDMAImage2D_grey(unsigned long, unsigned long, unsigned int, unsigned int, unsigned long, int, void*, void*)) >>> referenced by memory:3439 (/ndk/android-ndk-r25c/sources/cxx-stl/llvm-libc++/include/memory:3439) >>> /opt9/zhangxilun/IAC2328_AIFRC/build/android/jni/output/libs/local/arm64-v8a/objs/vivo_aifrc/./__/__/__/src/util/opencl_context.o:(std::__ndk1::shared_ptr<cl::Image>::operator=(std::__ndk1::shared_ptr<cl::Image> const&)) clang++: error: linker command failed with exit code 1 (use -v to see invocation) make: *** [/ndk/android-ndk-r25c/build/core/build-binary.mk:657: /opt9/zhangxilun/IAC2328_AIFRC/build/android/jni/output/libs/local/arm64-v8a/libvivo_aifrc.so] Error 1
最新发布
10-21
cmd.exe /C "cd . && D:\android-sdk-windows\ndk\25.1.8937393\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=aarch64-none-linux-android24 --sysroot=D:/android-sdk-windows/ndk/25.1.8937393/toolchains/llvm/prebuilt/windows-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -std=c++14 -fno-limit-debug-info -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--fatal-warnings -Wl,--gc-sections -Wl,--no-undefined -Qunused-arguments -shared -Wl,-soname,libmyapplication.so -o D:\Projects\MyApplication\app\build\intermediates\cxx\Debug\1h1g1tb5\obj\arm64-v8a\libmyapplication.so CMakeFiles/myapplication.dir/src/pdr_local_interface.cpp.o CMakeFiles/myapplication.dir/src/pdr_infer.cpp.o CMakeFiles/myapplication.dir/native-lib.cpp.o D:/android-sdk-windows/ndk/25.1.8937393/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/lib/aarch64-linux-android/24/liblog.so -landroid -llog -latomic -lm && cd ." ld: error: undefined symbol: Riemann::Pdr::RiemannPdr::GetInstance() >>> referenced by pdr_infer.cpp:20 (D:/Projects/MyApplication/app/src/main/cpp/src/pdr_infer.cpp:20) >>> CMakeFiles/myapplication.dir/src/pdr_infer.cpp.o:(Riemann::Pdr::PdrInfer::Init(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> >)) >>> referenced by pdr_infer.cpp:285 (D:/Projects/MyApplication/app/src/main/cpp/src/pdr_infer.cpp:285) >>> CMakeFiles/myapplication.dir/src/pdr_infer.cpp.o:(Riemann::Pdr::PdrInfer::NetInference()) >>> referenced by native-lib.cpp:18 (D:/Projects/MyApplication/app/src/main/cpp/native-lib.cpp:18) >>> CMakeFiles/myapplication.dir/native-lib.cpp.o:(Java_com_example_myapplication_MainActivity_stringFromJNI) >>> referenced 1 more times
07-09
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值