我一直认为GCC会将static const变量放到ELF或此类文件的.rodata段(或.text优化段).但似乎并非如此.
我目前gcc (GCC) 4.7.0 20120505 (prerelease)在使用GNU/Linux的笔记本电脑上使用.它确实将一个静态常量变量放在.bss段中:
/*
* this is a.c, and in its generated asm file a.s, the following line gives:
* .comm a,4,4
* which would place variable a in .bss but not .rodata(or .text)
*/
static const int a;
int main()
{
int *p = (int*)&a;
*p = 0; /* since a is in .data, write access to that region */
/* won't trigger an exception …Run Code Online (Sandbox Code Playgroud) 说,我有几个源代码,a.c, b.c, ..., z.c我想要一个规则来编译它们.这是一个解决方案:
%.o: %.c
$(CC) -c -o $@ $(CFLAGS) $<
Run Code Online (Sandbox Code Playgroud)
然后,我介绍了一个标题c.h中使用c.c,而另一头e.h在使用c.c和e.c,事情变得复杂:
%.o: %.c
$(CC) -c -o $@ $(CFLAGS) $<
c.o: c.c c.h e.h
$(CC) -c -o $@ $(CFLAGS) $<
e.o: e.c e.h
$(CC) -c -o $@ $(CFLAGS) $<
Run Code Online (Sandbox Code Playgroud)
根据条件1的溶液,有像add_dependency在make简化溶液,将获得类似下面的一个?
%.o: %.c
$(CC) -c -o $@ $(CFLAGS) $<
add_dependency(c.o, c.h e.h)
add_dependency(e.o, e.h)
Run Code Online (Sandbox Code Playgroud)
或者,您认为条件1的更好解决方案是什么?
编辑:
感谢亲切的通知@ctheo :)
是的,我确实看过autotools并了解到它将满足我的所有需求.不过我正在处理的是现有的项目和它 …
让我们从C++中的示例代码开始:
#include <vector>
#include <iostream>
int main()
{
std::vector<int> vec;
vec.push_back(0);
for (int i = 1; i < 5; i++)
{
const auto &x = vec.back();
std::cout << "Before: " << x << ", ";
vec.push_back(i);
std::cout << "After: " << x << std::endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
代码是用g++ test.cc -std=c++11 -O0以下编译的,结果如下:
Before: 0, After: 0
Before: 1, After: 0
Before: 2, After: 2
Before: 3, After: 3
Run Code Online (Sandbox Code Playgroud)
我期待第二行输出
Before: 1, After: 1
Run Code Online (Sandbox Code Playgroud)
因为x是对向量中的项的引用,不应通过向向量附加项来修改该项.
但是我现在还没有阅读反汇编代码或进行任何其他调查.此外,我不知道这是否是语言标准中的未定义行为.
我想要解释一下.谢谢.
我理解为什么如果你有不受信任的输入,使用'shell = True'可能会带来安全风险.但是,我不明白'shell = False'是如何避免同样的风险的.
假设我想允许用户提供他可能输入的输入:var ="rm -rf /"
我的代码可能只是:
subprocess.call(var,shell=True) # bad stuff
Run Code Online (Sandbox Code Playgroud)
或者我可能会这样做:
varParts=var.split()
subprocess.call(varParts,shell=False) # also bad, right?
Run Code Online (Sandbox Code Playgroud)
看起来这个假设是不会像第二个例子那样经历处理输入的麻烦,因此这会/不可能发生?
有一个叫做"-Tmp-"的名字,我怎么能cd进去呢?
当我使用时cd,它提示为:
$ cd -Tmp-/
cd: -T: invalid options
Run Code Online (Sandbox Code Playgroud)
有人可以帮帮我吗?
#include<stdio.h>
#include<stdlib.h>
#define MINUTES_PER_HOUR 60
int main(void){
double distance, vel1, vel2;
double min_to_meet;
int hr_to_meet;
printf("enter the distance separating the trains?\n");
scanf("%1f", &distance);
printf("what is the speed of train 1?\n");
scanf("%1f, &vel1");
printf("what is the speed of train 2?\n");
scanf("%1f, &vel2");
hr_to_meet = distance/(vel1 + vel2);
min_to_meet = hr_to_meet*MINUTES_PER_HOUR;
printf("it will take %.31f minutes to meet.\n", min_to_meet);
printf("the first train will travel %.21f miles.\n", vel1*hr_to_meet);
printf("the second train will travel %.21f miles.\n", vel2*hr_to_meet);
system("pause");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我一直都是零,因为我的答案可以告诉我什么是错的?