示例:我想将F12键绑定到命令,echo "foobar"
这样每次我点击F12消息"foobar"都会打印到屏幕上.理想情况下,它可以是任意shell命令,而不仅仅是内置命令.怎么会这样呢?
我有一个C项目,生成十个可执行文件,我想要静态链接所有这些可执行文件.我面临的问题是这些可执行文件中的一个使用第三方库,其中只有共享对象版本可用.
如果我将-static
标志传递给gcc,ld将会错误地说它无法找到有问题的库(我认为它正在寻找.a版本)并且不会构建可执行文件.理想情况下,如果无法找到静态库,我希望能够尽可能地告诉'ld'静态链接并故障转移到共享对象库.
在interium中我尝试了类似gcc -static -lib1 -lib2 -shared -lib3rdparty foo.c -o foo.exe
希望'ld'在lib1和lib2中静态链接,但只对lib3rdparty有运行时依赖.不幸的是,这不符合我的意图; 相反,-shared
标志覆盖了-static
标志,所有内容都被编译为共享对象.
是静态链接一个全有或全无的交易,还是有某种方式我可以混合和匹配?
我已经看到了"不透明类型"的概念,但我真的没有找到一个简洁的答案,关于什么定义了C中的opaque类型,更重要的是它们允许我们用它们的存在解决的问题.谢谢
当我第一次被介绍到CI被告知总是在函数的顶部声明我的变量.现在我对语言有了很强的把握,我将重点放在编码风格上,特别是限制了变量的范围.我已经阅读了限制范围的好处,我遇到了一个有趣的例子.显然,C99允许你这样做......
for (int i = 0; i < 10; i++)
{
puts("hello");
}
Run Code Online (Sandbox Code Playgroud)
我原以为一个变量的作用域是由最内层的限制周围的花括号{ }
,但在上面的例子中int i
出现通过的,即使是他们的之外声明for循环的花括号中范围有限.
我试图扩展上面的例子fgets()
来做我认为类似的东西,但这两个都给了我一个语法错误.
fgets(char fpath[80], 80, stdin);
*见说明**
fgets(char* fpath = malloc(80), 80, stdin);
那么,在C99中声明变量的确切位置是合法的吗?for循环示例是规则的例外吗?这适用于while
和do while
循环吗?
*注意**:我甚至不确定这在语法上是否正确,即使我可以在那里声明char数组,因为fgets()
它正在寻找指向char的指针而不是指向char 数组80的指针.这就是我尝试该malloc()
版本的原因.
关于除零,标准说:
C99 6.5.5p5 - /运算符的结果是第一个操作数除以第二个操作数的商; %运算符的结果是余数.在这两个操作中,如果第二个操作数的值为零,则行为未定义.
C++ 03 5.6.4 - 二进制/运算符产生商,二进制%运算符从第一个表达式除以第二个表达式得到余数.如果/或%的第二个操作数为零,则行为未定义.
如果我们将上述段落视为面值,答案显然是两种语言的未定义行为.但是,如果我们进一步了解C99标准,我们会看到以下段落似乎是矛盾的(1):
C99 7.12p4 - 宏INFINITY扩展为float类型的常量表达式,表示正无穷大或无符号无穷大(如果可用);
标准是否有某种黄金法则,其中未定义的行为不能被(可能)矛盾的陈述所取代?除此之外,我认为如果你的实现定义了INFINITY宏,那么将零除法定义为这样是不合理的.但是,如果您的实现没有定义这样的宏,则行为是Undefined.
我很好奇这两种语言在这个问题上的共识是什么(如果有的话).如果我们谈论整数除法int i = 1 / 0
与浮点除法,答案会改变float i = 1.0 / 0.0
吗?
注意(1) C++ 03标准讨论了<cmath>
包含INFINITY宏的库.
现在,我把头脑缠绕在'C'语言上,以至于我觉得自己足够精通编写干净的代码,我想把注意力集中在项目架构指南上.我正在寻找一个包含以下主题的好资源:
理想情况下,我希望看到一些示例项目,从小到大,看看架构如何根据项目大小,功能或客户而变化.
您会为这些主题推荐哪些资源?
是否有可能通过TortoiseSVN知道您将在提交之前获得的SVN转数,以便我可以将rev#放入源代码注释部分?
也许有一个特殊的键名/变量我可以放入我的文件中,TortoiseSVN将自动替换为它即将提交的rev#?
这背后的动机是我可以通过查看源代码来获取最新版本,并查看它包含的SVN版本.它还给管理层带来了温暖的模糊.
我必须使用awk在csv文件中打印出4个不同的列.问题是字符串是$ x,xxx.xx格式.当我运行常规awk命令时.
awk -F, {print $1} testfile.csv
Run Code Online (Sandbox Code Playgroud)
我的输出结果看起来像
307.00
$132.34
30.23
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么.
"$141,818.88","$52,831,578.53","$52,788,069.53"
这大致是输入.我必须解析的文件是90,000行和大约40列这是输入的布局方式,或者至少是我必须处理的部分.对不起,如果我让你认为这不是我所说的.
如果输入为"$ 307.00","$ 132.34","$ 30.23",我希望输出为
$307.00
$132.34
$30.23
Run Code Online (Sandbox Code Playgroud) 我的一位同事正在查看我们继承的代码库之一,并找到以下行:
ATLASSERT( rtaddress == m_lRTAddress && "Creation settings should match FIFO" );
我们不明白字符串文字的目的是什么; 这不仅仅是评论吗?我看到它的方式,如果rtaddress
不相等m_lRTAddress
那么由于短路将永远不会评估字符串.如果rtaddress
DOES等于,m_lRTAddress
则将对字符串文字进行求值,但是对于布尔表达式求值的字符串文字将始终返回true
; 那有什么意义呢?
所以我有这段简单的代码,演示了一个简单的缓冲区溢出:
#include <stdio.h>
int main(void)
{
char c[4] = { 'A', 'B', 'C', 'D' };
char d[4] = { 'W', 'X', 'Y', 'Z' };
printf("c[0] is '%c'\n", c[0]);
d[4] = 'Z'; /* Overflow that overwrites c[0] */
printf("c[0] is '%c'\n", c[0]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
$ ./a.out
c[0] is 'A'
c[0] is 'Z'
Run Code Online (Sandbox Code Playgroud)
我尝试使用以下gcc选项编译此代码,并使用飞行颜色传递:
gcc -Wall -Wextra -Wformat=2 -Wswitch-default -Wcast-align -Wpointer-arith \
-Wbad-function-cast -Wstrict-prototypes -Winline -Wundef -Wnested-externs \
-Wcast-qual -Wshadow -Wwrite-strings -Wconversion -Wunreachable-code \
-Wstrict-aliasing=2 -ffloat-store -fno-common -fstrict-aliasing \
-Wstack-protector …
Run Code Online (Sandbox Code Playgroud) c ×7
c++ ×2
architecture ×1
awk ×1
bash ×1
binding ×1
coding-style ×1
csv ×1
debugging ×1
declaration ×1
gcc ×1
linker ×1
revision ×1
shell ×1
stack ×1
static ×1
svn ×1
tortoisesvn ×1
types ×1
variables ×1