我正在研究C++中的裸机皮质-3M,以获得乐趣和利润.我使用STL库,因为我需要一些容器.我认为通过简单地提供我的分配器,它不会为最终二进制文件添加太多代码,因为你只得到你使用的东西.
我实际上甚至没有想到任何链接过程与STL(给我的分配器),因为我认为这是所有模板代码.
-fno-exception顺便说一句,我正在编译.
不幸的是,我的二进制文件中添加了大约600KB或更多.我查找了最终二进制文件中包含哪些符号,这对我来说似乎是一个笑话.这份清单太长了,我不会试着过去.虽然有一些弱的符号.
我还查看了链接器生成的.map文件,我甚至找到了scanf符号
.text
0x000158bc 0x30 /CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/bin/../arm-none-linux-gnueabi/libc/usr/lib/libc.a(sscanf.o)
0x000158bc __sscanf
0x000158bc sscanf
0x000158bc _IO_sscanf
Run Code Online (Sandbox Code Playgroud)
和:
$ arm-none-linux-gnueabi-nm binary | grep scanf
000158bc T _IO_sscanf
0003e5f4 T _IO_vfscanf
0003e5f4 T _IO_vfscanf_internal
000164a8 T _IO_vsscanf
00046814 T ___vfscanf
000158bc T __sscanf
00046814 T __vfscanf
000164a8 W __vsscanf
000158bc T sscanf
00046814 W vfscanf
000164a8 W vsscanf
Run Code Online (Sandbox Code Playgroud)
我该怎么调试呢?首先,我想了解GCC究竟用于链接(我通过GCC链接).我知道如果在文本段中找到符号,则使用整个段,但仍然太多了.
任何关于如何解决这个问题的建议都会受到赞赏.
谢谢
在编译时,是否有办法验证给定值是否在给定枚举的值内,因此有效?
enum myenum { val1 = 10, val2 = 30, val3 = 45 }
template <myenum t>
class myClass
{ ... }
myClass<10> a; // fails, OK
myClass<val1> b; // compiles OK
myClass<myenum(24)> c; //compiles, NOT OK!
Run Code Online (Sandbox Code Playgroud)
使用第二个模板非类型布尔参数在那里是有用的,并且该布尔值将由元函数给出,给定值将验证该值是否在myenum的值内.
我查看了各种枚举相关的问题,比如如何迭代枚举,似乎无法完成.
我必须生成一个仅在某些条件下包含某些字段的数据结构.这通常总是转化为以下内容
struct MyStruct {
int alwaysHere;
#ifdef WHATEVER
bool mightBeHere;
#endif
char somethingElse;
#if SOME_CONSTANT > SOME_VALUE
uint8_t alywasHereButDifferentSize;
#else
uint16_t alywasHereButDifferentSize;
#endif
...
};
Run Code Online (Sandbox Code Playgroud)
从我的观点来看,这看起来很难看,而且难以理解.甚至没有谈论处理这些字段的代码,通常也在ifdef下.
我正在寻找一种优雅的方法来实现相同的结果,而不会增加任何开销,但代码更具可读性.模板专业化似乎有点过分,但在我看来它是唯一的选择.
C++ 11是否会添加任何内容来处理这种情况?
任何建议将不胜感激.