匿名namespace,linkage,non-type argument

本文详细解释了C和C++编程语言中的内部链接与外部链接的概念。内部链接意味着标识符仅在其被编译的文件中可见,而外部链接则使得标识符在所有被编译的文件中共享同一存储空间。

好久没有更新了。收集一下最近看过的几个问题的link

关于匿名namespace的作用

http://bbs.ustc.edu.cn/cgi/bbsgcon?bn=CPlusPlus&fn=G460B6463&num=326

关于里面使用了 non-type argument来测试linkage的作法,因为是需要编译时就知道值的所以参数必须是external linkage的

关于external linkage,internal linkage,no linkage区别可以看下面的文字

Linkage
To understand the behavior of C and C++ programs, you need to know about linkage. In an executing program, an identifier is represented by storage in memory that holds a variable or a compiled function body. Linkage describes this storage as it is seen by the linker. There are two types of linkage: internal linkage and external linkage.


Internal linkage means that storage is created to represent the identifier only for the file being compiled. Other files may use the same identifier name with internal linkage, or for a global variable, and no conflicts will be found by the linker – separate storage is created for each identifier. Internal linkage is specified by the keyword static in C and C++.


External linkage means that a single piece of storage is created to represent the identifier for all files being compiled. The storage is created once, and the linker must resolve all other references to that storage. Global variables and function names have external linkage. These are accessed from other files by declaring them with the keyword extern. Variables defined outside all functions (with the exception of const in C++) and function definitions default to external linkage. You can specifically force them to have internal linkage using the static keyword. You can explicitly state that an identifier has external linkage by defining it with the extern keyword. Defining a variable or function with extern is not necessary in C, but it is sometimes necessary for const in C++.


Automatic (local) variables exist only temporarily, on the stack, while a function is being called. The linker doesn’t know about automatic variables, and so these have no linkage.

Go confidently in the  directions of your dreams,live the life you have imagined!Just do it!
It is no use learning without thinking!

注意全局变量,函数除了const外都是external的。const是internal的

我们在头文件中加上了extern的关键字只是为了表示是declare而不是define而已。(一直在误解中...才明白)

FAILED: cpp/inspireface/CMakeFiles/InspireFace.dir/c_api/inspireface.cc.o D:\android\Android\Sdk\ndk\25.2.9519653\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=aarch64-none-linux-android21 --sysroot=D:/android/Android/Sdk/ndk/25.2.9519653/toolchains/llvm/prebuilt/windows-x86_64/sysroot -DFEATURE_BLOCK_ENABLE_OPENCV -DINFERENCE_WRAPPER_ENABLE_MNN -DISF_BUILD_SHARED_LIBS -DInspireFace_EXPORTS -DSODIUM_STATIC -ID:/insightface-master/insightface-master/cpp-package/inspireface/3rdparty/InspireCV/3rdparty/Eigen-3.4.0-Headers -ID:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/. -ID:/insightface-master/insightface-master/cpp-package/inspireface/3rdparty/MNN/include -ID:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/libsodium-cmake-master/libsodium/src/libsodium/include -ID:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/libcorrect/include -ID:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/include/inspireface -ID:/insightface-master/insightface-master/cpp-package/inspireface/3rdparty/yaml-cpp/include -ID:/insightface-master/insightface-master/cpp-package/inspireface/3rdparty/inspireface-precompile-lite/sqlite -ID:/insightface-master/insightface-master/cpp-package/inspireface/3rdparty/InspireCV/include -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -g0 -std=c++14 -O3 -O3 -mfpu=neon -O3 -DNDEBUG -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -MD -MT cpp/inspireface/CMakeFiles/InspireFace.dir/c_api/inspireface.cc.o -MF cpp\inspireface\CMakeFiles\InspireFace.dir\c_api\inspireface.cc.o.d -o cpp/inspireface/CMakeFiles/InspireFace.dir/c_api/inspireface.cc.o -c D:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/c_api/inspireface.cc clang++: warning: argument unused during compilation: '-mfpu=neon' [-Wunused-command-line-argument] In file included from D:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/c_api/inspireface.cc:8: In file included from D:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/c_api/inspireface_internal.h:9: In file included from D:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/./engine/face_session.h:13: In file included from D:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/./track_module/face_track_module.h:9: In file included from D:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/./track_module/face_detect/face_detect_adapt.h:10: In file included from D:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/./middleware/any_net_adapter.h:15: In file included from D:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/./middleware/model_archive/inspire_archive.h:15: D:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/./track_module/landmark/landmark_param.h:13:15: warning: anonymous non-C-compatible type given name for linkage purposes by typedef declaration; add a tag name here [-Wnon-c-typedef-for-linkage] typedef struct { ^ SemanticIndex D:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/./track_module/landmark/landmark_param.h:14:31: note: type is not C-compatible due to this default member initializer int32_t left_eye_center = 67; ^~ D:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/./track_module/landmark/landmark_param.h:23:3: note: type is given name 'SemanticIndex' for linkage purposes by this typedef declaration } SemanticIndex; ^ In file included from D:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/c_api/inspireface.cc:8: In file included from D:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/c_api/inspireface_internal.h:9: In file included from D:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/./engine/face_session.h:13: In file included from D:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/./track_module/face_track_module.h:16: D:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/./track_module/tracker_optional/bytetrack/BYTETracker.h:33:141: warning: implicit conversion from 'long' to 'float' changes value from 9223372036854775807 to 9223372036854775808 [-Wimplicit-const-int-float-conversion] double lapjv(const vector<vector<float> > &cost, vector<int> &rowsol, vector<int> &colsol, bool extend_cost = false, float cost_limit = LONG_MAX, ~ ^~~~~~~~ D:/android/Android/Sdk/ndk/25.2.9519653/toolchains/llvm/prebuilt/windows-x86_64/lib64/clang/14.0.7/include/limits.h:47:19: note: expanded from macro 'LONG_MAX' #define LONG_MAX __LONG_MAX__ ^~~~~~~~~~~~ <built-in>:84:22: note: expanded from here #define __LONG_MAX__ 9223372036854775807L ^~~~~~~~~~~~~~~~~~~~ D:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/c_api/inspireface.cc:117:20: error: use of undeclared identifier 'token' result->size = token.size(); ^ D:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/c_api/inspireface.cc:118:37: error: use of undeclared identifier 'token' result->data = (uint8_t*)malloc(token.size()); ^ D:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/c_api/inspireface.cc:119:26: error: use of undeclared identifier 'token' memcpy(result->data, token.data(), token.size()); ^ D:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/c_api/inspireface.cc:119:40: error: use of undeclared identifier 'token' memcpy(result->data, token.data(), token.size()); ^ 2 warnings and 4 errors generated. [545/568] Building CXX object cpp/inspireface/CMakeFiles/InspireFace.dir/track_module/face_track_module.cpp.o clang++: warning: argument unused during compilation: '-mfpu=neon' [-Wunused-command-line-argument] In file included from D:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/track_module/face_track_module.cpp:6: In file included from D:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/track_module/face_track_module.h:9: In file included from D:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/track_module/face_detect/face_detect_adapt.h:10: In file included from D:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/./middleware/any_net_adapter.h:15: In file included from D:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/./middleware/model_archive/inspire_archive.h:15: D:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/./track_module/landmark/landmark_param.h:13:15: warning: anonymous non-C-compatible type given name for linkage purposes by typedef declaration; add a tag name here [-Wnon-c-typedef-for-linkage] typedef struct { ^ SemanticIndex D:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/./track_module/landmark/landmark_param.h:14:31: note: type is not C-compatible due to this default member initializer int32_t left_eye_center = 67; ^~ D:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/./track_module/landmark/landmark_param.h:23:3: note: type is given name 'SemanticIndex' for linkage purposes by this typedef declaration } SemanticIndex; ^ In file included from D:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/track_module/face_track_module.cpp:6: In file included from D:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/track_module/face_track_module.h:16: D:/insightface-master/insightface-master/cpp-package/inspireface/cpp/inspireface/track_module/tracker_optional/bytetrack/BYTETracker.h:33:141: warning: implicit conversion from 'long' to 'float' changes value from 9223372036854775807 to 9223372036854775808 [-Wimplicit-const-int-float-conversion] double lapjv(const vector<vector<float> > &cost, vector<int> &rowsol, vector<int> &colsol, bool extend_cost = false, float cost_limit = LONG_MAX, ~ ^~~~~~~~ D:/android/Android/Sdk/ndk/25.2.9519653/toolchains/llvm/prebuilt/windows-x86_64/lib64/clang/14.0.7/include/limits.h:47:19: note: expanded from macro 'LONG_MAX' #define LONG_MAX __LONG_MAX__ ^~~~~~~~~~~~ <built-in>:84:22: note: expanded from here #define __LONG_MAX__ 9223372036854775807L ^~~~~~~~~~~~~~~~~~~~ 2 warnings generated. [546/568] Building CXX object cpp/inspireface/CMakeFiles/I...track_module/tracker_optional/bytetrack/kalmanFilter.cpp.o clang++: warning: argument unused during compilation: '-mfpu=neon' [-Wunused-command-line-argument] [547/568] Building C object cpp/inspireface/CMakeFiles/Ins...__/3rdparty/inspireface-precompile-lite/sqlite/sqlite3.c.o ninja: build stopped: subcommand failed. Build-AndroidArch : Ninja 编译失败! 所在位置 D:\insightface-master\insightface-master\cpp-package\inspireface\command\build_android.ps1:247 字符: 1 + Build-AndroidArch "arm64-v8a" 21 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,Build-AndroidArch
08-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值