相关疑难解决方法(0)

以编译方式在C++中编译时创建静态数组

可以在编译时定义静态数组,如下所示:

const std::size_t size = 5;    
unsigned int list[size] = { 1, 2, 3, 4, 5 };
Run Code Online (Sandbox Code Playgroud)

问题1 - 是否可以通过使用各种元编程技术在编译时"以编程方式"分配这些值?

问题2 - 假设数组中的所有值都是相同的barr,是否可以在编译时以编程方式选择性地分配值?

例如:

const std::size_t size = 7;        
unsigned int list[size] = { 0, 0, 2, 3, 0, 0, 0 };
Run Code Online (Sandbox Code Playgroud)
  1. 欢迎使用C++ 0x的解决方案
  2. 阵列可能非常大,几百个元素长
  3. 现在的数组只包含POD类型
  4. 还可以假设,以静态编译时兼容的方式预先知道阵列的大小.
  5. 解决方案必须是C++ (没有脚本,没有宏,没有pp或基于代码生成器的解决方案)

更新: Georg Fritzsche的解决方案非常棒,需要一些工作才能在msvc和intel编译器上进行编译,但这仍然是解决问题的一种非常有趣的方法.

c++ metaprogramming static-array

63
推荐指数
3
解决办法
3万
查看次数

C++:何时(以及如何)调用C++全局静态构造函数?

我正在研究一些C++代码,我遇到了一个问题,这个问题一直在唠叨我...假设我正在Linux主机上用GCC编译ELF目标,那里是全局静态构造函数和析构函数叫什么名字?

我听说crtbegin.o中有一个函数_init,crtend.o中有函数_fini.这些是由crt0.o调用的吗?或者动态链接器是否实际检测到它们在加载的二进制文件中的存在并调用它们 如果是这样,它实际上给他们打电话?

我主要感兴趣的是,因为我的代码被加载,执行,然后在运行时卸载,所以我可以理解幕后发生的事情.

提前致谢!

更新:我基本上试图找出构造函数被调用的一般时间.我不想根据这些信息在我的代码中做出假设,或多或少地更好地了解我的程序加载时在较低级别发生的事情.我知道这是特定于操作系统的,但我试图在这个问题上稍微缩小一点.

c++ static gcc constructor global

24
推荐指数
5
解决办法
2万
查看次数

技巧:使用宏填充数组值(代码生成)

C++模板是伪装的宏吗?

我正在阅读上面的主题,突然想到了这个想法:为什么不尝试编写一些可以在我们的真实代码中使用的棘手的宏(不只是作为在现实生活中无用的谜题)?

所以首先想到的是:用宏填充数组值:

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] …
Run Code Online (Sandbox Code Playgroud)

c c++ arrays macros

11
推荐指数
2
解决办法
7087
查看次数

标签 统计

c++ ×3

arrays ×1

c ×1

constructor ×1

gcc ×1

global ×1

macros ×1

metaprogramming ×1

static ×1

static-array ×1