我已经在C工作了很长时间以至于编译器通常在一个开头添加一个下划线这一事实extern只是被理解......然而,今天另一个SO问题让我想知道为什么添加下划线的真正原因.一篇维基百科文章称,原因是:
C编译器的常见做法是在所有外部作用域程序标识符之前加上前导下划线,以避免与运行时语言支持的贡献发生冲突
我认为这至少有一个真实的核心,但它似乎并没有真正回答这个问题,因为如果将下划线添加到所有外部,它对防止冲突没有多大帮助.
有没有人有关于领先下划线的理由的良好信息?
增加的下划线部分原因是Unix creat()系统调用不以'e'结尾?我听说某些平台上的早期链接器名称限制为6个字符.如果是这种情况,那么将下划线添加到外部名称似乎是一个彻头彻尾的疯狂想法(现在我只有5个字符可以玩......).
我该如何解决这个错误?
Can't locate Switch.pm in @INC (you may need to install the Switch module) (@INC contains: /etc/perl /usr/local/lib/perl/5.18.2 /usr/local/share/perl/5.18.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.18 /usr/share/perl/5.18 /usr/local/lib/site_perl .) at external/webkit/Source/WebCore/make-hash-tools.pl line 23.
BEGIN failed--compilation aborted at external/webkit/Source/WebCore/make-hash-tools.pl line 23.
make: *** [out/target/product/generic/obj/STATIC_LIBRARIES/libwebcore_intermediates/Source/WebCore/html/DocTypeStrings.cpp] Error 2
Run Code Online (Sandbox Code Playgroud) 我最近了解了GCC的一些C库内存管理功能的__builtin_malloc()内置函数,特别是相关的内置函数(参见https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html) .在了解之后__builtin_malloc(),我想知道如何提供相对于普通malloc()相关库例程的性能改进.
例如,如果函数成功,它必须提供一个可以通过调用plain释放的块,free()因为指针可能被没有__builtin_malloc()或__builtin_free()启用的模块释放(或者我错了,如果__builtin_malloc()使用的话) ,内置必须全局使用?).因此,分配的对象必须是可以使用简单malloc()和free()处理的数据结构来管理的东西.
我找不到任何有关如何__builtin_malloc()工作或它的确切功能的详细信息(我不是编译器开发人员,所以通过GCC源代码进行探索不在我的驾驶室中).在我尝试__builtin_malloc()直接调用的一些简单测试中,它最终只是作为对plain的调用在目标代码中发出malloc().但是,在这些简单的测试中,我可能没有提供细微或平台细节.
__builtin_malloc()通过普通电话可以提供哪些性能改进malloc()?是否__builtin_malloc()依赖于glibc malloc()实现使用的相当复杂的数据结构?或者相反,glibc malloc()/ free()有一些代码来处理可能被分配的块__builtin_malloc()吗?
基本上,它是如何工作的?
我可以使用以下命令.config根据基于ARM的自定义板的指定体系结构默认值创建Linux内核文件:
ARCH=arm make defconfig KBUILD_DEFCONFIG=var_som_mx6_android_defconfig
Run Code Online (Sandbox Code Playgroud)
我以为这个命令或多或少复制./arch/arm/configs/var_som_mx6_android_defconfig到了./.config.但是,生成的.config文件并不完全是副本:
$ diff --unified arch/arm/configs/var_som_mx6_android_defconfig .config
--- arch/arm/configs/var_som_mx6_android_defconfig 2017-01-20 12:10:51.891515984 -0800
+++ .config 2017-01-26 15:31:29.000000000 -0800
@@ -407,6 +407,7 @@
CONFIG_ARM_ERRATA_751472=y
CONFIG_ARM_ERRATA_794072=y
CONFIG_ARM_ERRATA_761320=y
+CONFIG_ARM_ERRATA_845369=y
# CONFIG_ARM_ERRATA_753970 is not set
CONFIG_ARM_ERRATA_754322=y
# CONFIG_ARM_ERRATA_754327 is not set
@@ -2683,7 +2684,6 @@
CONFIG_AUTOFS4_FS=y
CONFIG_FUSE_FS=y
# CONFIG_CUSE is not set
-CONFIG_AUFS_FS=y
#
# Caches
@@ -2759,6 +2759,21 @@
# CONFIG_PSTORE is not set
# CONFIG_SYSV_FS is not set
# CONFIG_UFS_FS is …Run Code Online (Sandbox Code Playgroud) 我正在开发一个嵌入式系统项目,该系统使用XML将数据输入和输出系统.我不希望XML处理转换成一堆使用snprintf()/ strcat()和朋友构建XML字符串或通过计算" <"和" >"字符来解析XML的位.
我发现了几个XML库,其中一些甚至可能足够小,但它们最接近C的是C++,这不是这个系统的卡片.我希望我能找到一个满足以下约束条件的XML库:
它不一定是一个完整的解析器 - 我只是希望能够从嵌套元素中提取文本,并且有一种相当简单的方法来生成不依赖于格式字符串的XML.尚未使用属性,因此库甚至不需要支持它们.XML文档非常小,所以类似DOM的东西就可以了,只要它可以与客户端提供的缓冲区一起使用(就地解析原始XML会很好).
PugXML和TinyXML看起来非常接近,但我希望那里的人知道一个专为基于C的嵌入式系统量身定制的XML库,我的谷歌搜索正在丢失.
在XML中存储引用数据的可接受方式是什么?
例如,对于一个节点,哪个是正确的?
如果(a),你对属性做了什么?如果(c),混合HTML和XML真的合适吗?同样,你如何处理单引号和引号?
谷歌快速搜索这个问题表明它很常见,我不能为我的生活找到解决方案.
我直接从wxWidgets网站直接安装wxWidgets 2.8.8 for Windows.
每当我尝试编译任何东西时(例如"wxWidgets的第一个程序"中描述的示例应用程序 - http://zetcode.com/tutorials/wxwidgetstutorial/firstprograms/),我得到:
wx/setup.h:没有这样的文件或目录
我在我的编译器搜索列表中包含了C:\ wxWidgets-2.8.8\include和C:\ wxWidgets-2.8.8\include\wx.
应该很简单 - 但事实并非如此!:(
如果我尝试使用与wxWidgets集成的IDE(例如Code :: Blocks),同样的事情就会发生 - 而且,我想,这样就可以解决这个问题......
所以,请帮忙...为什么找不到setup.h?
我在Ubuntu Trusty上,我正在使用此命令构建以下代码.我是clang的新手,我可以使用帮助来调试这些错误.这些C绑定的cpp和hpp文件来自编译.我将这些文件中的标题复制到我在此处列出的文件w.cpp中
clang -std=c++11 w.cpp -o w `pkg-config --cflags --libs opencv`
Run Code Online (Sandbox Code Playgroud)
以下是错误:
/usr/bin/ld: /tmp/w-2a90f4.o: undefined reference to
symbol '_ZNSt8ios_base4InitD1Ev@@GLIBCXX_3.4'
//usr/lib/x86_64-linux-gnu/libstdc++.so.6: error adding
symbols: DSO missing from command line
clang: error: linker command failed with exit code 1
(use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)
这是w.cpp的内容.我正在尝试使用clang对代码进行基准测试.
#include <opencv2/c/mat.hpp>
#include <opencv2/c/opencv_generated.hpp>
using namespace cv;
using namespace std;
using namespace flann;
using namespace cvflann;
void cv_delete(char* self) {
delete self;
}
Mat* cv_create_Mat() {
return new Mat();
}
BFMatcher* cv_create_BFMatcher(int normType, bool crossCheck) {
return …Run Code Online (Sandbox Code Playgroud) 假设我有如下函数:
#define LOWER_BOUND 0
#define UPPER_BOUND 42
int is_value_in_range( some_typedef val)
{
return ((LOWER_BOUND <= val) && (val <= UPPER_BOUND));
}
Run Code Online (Sandbox Code Playgroud)
假设我已经正确配置了警告,如果some_typedef结果是无符号类型,我会得到一个警告,即无符号类型与0进行无意义的比较.当然这是真的,这是有道理的.
但是,假设我确实希望检查零以在代码中出于一个或多个可能的原因,例如:
是否有一种体面,合理的便携方式可以在不完全关闭警告的情况下使警告静音?
如果合理的话,那些依赖于'STATIC_ASSERT()'的功能(可供我使用)是可以接受的.如果类型更改以强制某人查看代码,我可以打破编译.但重要的是要注意,这typeof并非我所针对的所有编译器中都可用的东西.
我特意寻找C语言解决方案,因此模板在这里没有任何用处......
这个问题有没有办法让git pull自动更新子模块?有一个接受的配置git的答案,如下所示:
git config --global submodule.recurse true
Run Code Online (Sandbox Code Playgroud)
就像对该答案的评论之一,我想知道为什么这不是git的默认行为; 更确切地说,设置此配置选项有哪些缺点?