小编Mas*_*erM的帖子

C预处理器"字符串化"的对面

使用C预处理器时,可以像这样将字符串化为字符串:

#define TO_STRING(x) "a string with " #x
Run Code Online (Sandbox Code Playgroud)

所以使用时,结果如下:

TO_STRING(test) 将扩展到: "a string with test"

有没有办法做相反的事情?获取字符串文字作为输入参数并生成C标识符?例如:

TO_IDENTIFIER("some_identifier") 会扩大到: some_identifier

谢谢您的回答.

编辑:对于那些想知道我需要它的人:

我想通过字符串标识符来引用我的3D引擎的场景图中的节点,但同时避免在紧密循环中比较字符串.所以我想我会写一个简单的工具,它将在编译的预构建步骤中运行并搜索预定义的字符串 - 例如ID("something").然后,对于每个这样的令牌,它将计算括号之间的字符串的CRC32,并生成包含这些数字标识符的#defines的头文件.例如,对于字符串"something",它将是:

#define __CRC32ID_something 0x09DA31FB

然后,每个cpp文件将使用ID(x)宏包含生成的头文件.本ID("something")当然会扩大到__CRC32ID_something,所以在效果是什么,编译器会看到的是简单的整数标识符,而不是对人友好的字符串.当然,现在我只是满足于此,ID(something)但我认为使用引号会更有意义 - 一个不知道ID宏如何工作的程序员可以认为something没有引号是C标识符,而实际上这样的标识符不存在于所有.

c macros stringification c-preprocessor

38
推荐指数
1
解决办法
7720
查看次数

在OpenGL中可视化4D对象

你知道任何积极开发的C/C++库,它可以采用一堆(最好是大量)4D顶点,将它们投射到3D空间中,相对于某些任意"4D相机"投影矩阵并输出常规3D顶点我可以用OpenGL进行硬件加速可视化吗?我还需要能够在4D空间中执行标准变换(平移,沿所有4个轴旋转和均匀缩放).

c c++ opengl

34
推荐指数
1
解决办法
4256
查看次数

通过返回的指针访问函数静态结构时出现分段错误

我有以下结构:

struct sys_config_s
{
  char server_addr[256];
  char listen_port[100];
  char server_port[100];
  char logfile[PATH_MAX];
  char pidfile[PATH_MAX];
  char libfile[PATH_MAX];
  int  debug_flag;
  unsigned long connect_delay;
};
typedef struct sys_config_s sys_config_t;
Run Code Online (Sandbox Code Playgroud)

我还有一个在静态库中定义的函数(让我们称之为A.lib):

sys_config_t* sys_get_config(void)
{
  static sys_config_t config;
  return &config;
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个程序(我们称之为B)和一个动态库(我们称之为C).B和C都与A.lib链接.在运行时B打开C via dlopen(),然后func()通过调用获取C函数的地址dlsym().

void func(void)
{
  sys_get_config()->connect_delay = 1000;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码是C func()函数的主体,它到达时会产生分段错误.segfault仅在外面运行时发生gdb.

为什么会这样?

编辑:制作sys_config_t config全局变量没有帮助.

c debugging shared-libraries segmentation-fault data-structures

9
推荐指数
1
解决办法
1310
查看次数