gpt4 book ai didi

c++ - C 中的命名空间

转载 作者:IT老高 更新时间:2023-10-28 14:00:59 26 4
gpt4 key购买 nike

有没有办法(ab)使用 C 预处理器来模拟 C 中的命名空间?

我的想法是这样的:

#define NAMESPACE name_of_ns
some_function() {
some_other_function();
}

这将被翻译成:

name_of_ns_some_function() {
name_of_ns_some_other_function();
}

最佳答案

另一种选择是声明一个结构来保存所有函数,然后静态定义函数。那么您只需要担心全局名称结构的名称冲突。

// foo.h
#ifndef FOO_H
#define FOO_H
typedef struct {
int (* const bar)(int, char *);
void (* const baz)(void);
} namespace_struct;
extern namespace_struct const foo;
#endif // FOO_H

// foo.c
#include "foo.h"
static int my_bar(int a, char * s) { /* ... */ }
static void my_baz(void) { /* ... */ }
namespace_struct const foo = { my_bar, my_baz }

// main.c
#include <stdio.h>
#include "foo.h"
int main(void) {
foo.baz();
printf("%d", foo.bar(3, "hello"));
return 0;
}

在上面的例子中,my_barmy_baz不能直接从main.c调用,只能通过foo

如果你有一堆命名空间声明具有相同签名的函数,那么你可以标准化你的命名空间结构,并选择在运行时使用哪个命名空间。

// goo.h
#ifndef GOO_H
#define GOO_H
#include "foo.h"
extern namespace_struct const goo;
#endif // GOO_H

// goo.c
#include "goo.h"
static int my_bar(int a, char * s) { /* ... */ }
static void my_baz(void) { /* ... */ }
namespace_struct const goo = { my_bar, my_baz };

// other_main.c
#include <stdio.h>
#include "foo.h"
#include "goo.h"
int main(int argc, char** argv) {
namespace_struct const * const xoo = (argc > 1 ? foo : goo);
xoo->baz();
printf("%d", xoo->bar(3, "hello"));
return 0;
}

my_barmy_baz 的多个定义不冲突,因为它们是静态定义的,但仍然可以通过适当的命名空间结构访问底层函数。

关于c++ - C 中的命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/389827/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com