可以在编译时定义静态数组,如下所示:
const std::size_t size = 5;    
unsigned int list[size] = { 1, 2, 3, 4, 5 };
问题1 - 是否可以通过使用各种元编程技术在编译时"以编程方式"分配这些值?
问题2 - 假设数组中的所有值都是相同的barr,是否可以在编译时以编程方式选择性地分配值?
例如:
const std::size_t size = 7;        
unsigned int list[size] = { 0, 0, 2, 3, 0, 0, 0 };
更新: Georg Fritzsche的解决方案非常棒,需要一些工作才能在msvc和intel编译器上进行编译,但这仍然是解决问题的一种非常有趣的方法.
我正在研究一些C++代码,我遇到了一个问题,这个问题一直在唠叨我...假设我正在Linux主机上用GCC编译ELF目标,那里是全局静态构造函数和析构函数叫什么名字?
我听说crtbegin.o中有一个函数_init,crtend.o中有函数_fini.这些是由crt0.o调用的吗?或者动态链接器是否实际检测到它们在加载的二进制文件中的存在并调用它们 如果是这样,当它实际上给他们打电话?
我主要感兴趣的是,因为我的代码被加载,执行,然后在运行时卸载,所以我可以理解幕后发生的事情.
提前致谢!
更新:我基本上试图找出构造函数被调用的一般时间.我不想根据这些信息在我的代码中做出假设,或多或少地更好地了解我的程序加载时在较低级别发生的事情.我知道这是特定于操作系统的,但我试图在这个问题上稍微缩小一点.
我正在阅读上面的主题,突然想到了这个想法:为什么不尝试编写一些可以在我们的真实代码中使用的棘手的宏(不只是作为在现实生活中无用的谜题)?
所以首先想到的是:用宏填充数组值:
int f(int &i) { return ++i; }
#define e100     r5(m20)
#define m20      m5,m5,m5,m5
#define m5       r5(e1)
#define e1       f(i)  //avoiding ++i right here, to avoid UB!
#define r5(e)    e,e,e,e,e
int main() {
        int i=0;           //this is used in the macro e1
        int a[] = {e100};  //filling array values with macros!
        int n  = sizeof(a)/sizeof(int);
        cout << "count = " << n << endl;
        for(int i = 0 ; i < n ; i++ ) 
            cout << a[i] …