给出以下代码段:
#include <stdio.h>
typedef signed long long int64;
typedef signed int int32;
typedef signed char int8;
int main()
{
printf("%i\n", sizeof(int8));
printf("%i\n", sizeof(int32));
printf("%i\n", sizeof(int64));
int8 a = 100;
int8 b = 100;
int32 c = a * b;
printf("%i\n", c);
int32 d = 1000000000;
int32 e = 1000000000;
int64 f = d * e;
printf("%I64d\n", f);
}
Run Code Online (Sandbox Code Playgroud)
MinGW GCC 3.4.5的输出为(-O0):
1
4
8
10000
-1486618624
Run Code Online (Sandbox Code Playgroud)
第一个乘法在内部转换为int32(根据汇编程序输出).第二次乘法不是铸造的.我不确定结果是否不同,因为程序在IA32上运行,或者因为它是在C标准的某处定义的.然而,我感兴趣的是,这个确切的行为是在某处定义的(ISO/IEC 9899?),因为我想更好地理解为什么以及何时我需要手动编译(我有问题从不同的架构移植程序).
如果达到断点(或者在GDB shell中按下Ctrl + C),GDB通常会停止所有线程.我知道像调度程序锁定和调度多次这样的命令存在,但我认为没有可能让一个定义的线程在后台运行而另一个被调试.
我正在处理具有以下目录布局的大型项目:
Source
MyA
aa.cpp
ab.cpp
ac.cpp
MyB
ba.cpp
bb.cpp
bc.cpp
MyTest
testaa.cpp
testab.cpp
testac.cpp
testba.cpp
testbb.cpp
testbc.cpp
main.cpp
Build
MyA
aa.o
ab.o
ac.o
libMyA.a (static library)
MyB
ba.o
bb.o
bc.o
libMyB.a (static library)
MyTest
testaa.o
testab.o
testac.o
testba.o
testbb.o
testbc.o
MyTest (executable)
Run Code Online (Sandbox Code Playgroud)
在编译之后,-fprofile-arcs -ftest-coverage我在Build/MyTest目录中执行MyTest应用程序.正如预期的那样,Build目录中有*.gcno和*.gcda文件.在MyTest目录中运行gcov后,会生成不同的*.gcov文件,但不幸的是,MyA和MyB中的所有文件都没有,尽管在这两个库中调用了每个函数.尝试了不同的选项,但不知怎的,我无法用这种布局创建有用的(意味着正确的)*.gcov文件.
如果我复制一个目录中的每个cpp并重复这些步骤,一切都按预期工作,覆盖率分析是完美的.