大家好,我最近学会用C编程!(这对我来说是一个巨大的进步,因为C++是第一种语言,我接触并吓唬了我近10年.)来自大多数OO背景(Java + C#),这是一个非常好的范式转换.
我爱C.这是一种如此美丽的语言.令我感到惊讶的是,高级的模块化和代码可重用性C支持 - 当然它不像OO语言那么高,但仍远远超出我对命令式语言的期望.
如何防止客户端代码与C库代码之间的命名冲突?在Java中有包,在C#中有命名空间.想象一下,我写了一个C库,它提供了"添加"操作.客户端很可能已经使用了类似的操作 - 我该怎么办?
我特别想找一个客户友好的解决方案.例如,我不想为我的所有api操作添加前缀,例如"myuniquelibname_add".C世界中有哪些常见的解决方案?你把所有api操作放在一个结构中,所以客户端可以选择自己的前缀吗?
我非常期待通过你的答案得到的见解!
亲爱的Answerers,谢谢你的答案!我现在看到,前缀是安全避免命名冲突的唯一方法.所以,我想修改我的问题:我有什么可能,让客户选择他自己的前缀?
Unwind发布的答案是单向的.它不使用正常意义上的前缀,但必须在每个api调用前加上"api->".还有哪些解决方案(比如使用#define)?
这一切归结为两种方法之一:
我不接受任何答案,因为我认为没有正确的答案.选择的解决方案取决于具体情况和自己的偏好.我自己会尝试你提到的所有方法,找出最适合我的方法.随意在相应答案的评论中发布支持或反对某些appraoches的论据.
最后,我要特别感谢:
如果有人发现关闭这个问题是合适的(因为没有进一步的见解),他/她应该随意这样做 - 我无法决定这一点,因为我不是C大师.
想象一下我用C编写了一个库.进一步,想象一下这个库是从多线程环境中使用的.如何使其线程安全?更具体:我如何确保某些功能一次只能由一个线程执行?
例如,与Java或C#相反,C无法处理线程/锁/等,C标准库也没有.我知道,操作系统支持线程,但使用他们的api会极大地限制我的库的兼容性.我有哪些可能性,以保持我的库兼容/便携?(例如,依赖于OpenMP,或者在Posix线程上,使其至少与所有类似Unix的操作系统兼容?)
我有一个CUDA项目.它由几个包含我的应用程序逻辑的.cpp文件和一个包含多个内核的.cu文件以及一个__host__调用它们的函数组成.
现在我想确定我的内核使用的寄存器数量.我的普通编译器调用如下所示:
nvcc -arch compute_20 -link src/kernel.cu obj/..obj obj/..obj .. -o bin/..exe -l glew32 ...
不幸的是,在此调用中添加"-Xptxas -v"编译器标志无效.编译器仍然生成与以前相同的文本输出.编译后的.exe也可以像以前一样工作,只有一个例外:我的帧速率从80fps上升到1800fps.
给定一个只有正边权重的有向连通图,是否有比使用斐波纳契堆的Dijkstra更快的算法来找到两个顶点之间的最短路径?
维基百科说,Dijkstra在O(| E | + | V |*log(| V |))中(使用斐波纳契堆).
我不是在寻找优化,例如,执行时间的一半,而是具有不同时间复杂度的算法(如从O(n*log n)到O(n)).
此外,我想知道您对以下方法的看法:
第2点的示例:
想象一下GCD为1.然后我将边缘
A ---> B(边缘权重3)
转换为
A-> A' - > A'' - > B(边缘权重1的3倍)
这种转换需要花费不变的时间,并且必须针对每个边缘进行一次.所以我希望这个算法在O(| E |)(变换)+ O(| E | + | V |)(BFS)= O(2*| E | + | V |)= O(| E | + | V |)
感谢您抽出宝贵时间阅读我的问题,希望不要浪费你的时间^^.祝你今天愉快.