在C++中通常用某种前缀命名成员变量来表示它们是成员变量而不是局部变量或参数.如果你来自MFC背景,你可能会使用m_foo.我myFoo偶尔也见过.
C#(或者可能只是.NET)似乎建议只使用下划线,如_foo.这是否允许C++标准?
2者有什么区别?__INT_MAX__据我所知,它是在没有添加库的情况下定义的,并且INT_MAX是在 中定义的limits.h,但是当我包含该库时,INT_MAX它会以__INT_MAX__任何一种方式扩展(或者 VSCode 是这么说的)。limits.h当它扩展到另一种时,为什么我还要使用它?
extern int ether_hostton (__const char *__hostname, struct ether_addr *__addr)
__THROW;
Run Code Online (Sandbox Code Playgroud)
我在Linux机器上的/usr/include/netinet/ether.h中找到了上面的函数定义.
有人可以在const(关键字),addr(标识符)和最后__THROW前面解释双下划线的含义.
我正在做一些从Mono C#到Obj-C的Interop并遇到了这个问题.C#代码需要传递回调 - 它与函数指针一起执行.我可以从Obj-C端获取函数指针并调用它,一切正常.但我现在需要将该函数指针作为对第三方API的回调,该第三方API将块作为回调.我希望第三方调用C#函数 - 所以在某种程度上我试图将函数指针转换为块,以便第三方可以运行它,或者创建某种桥 - 创建我自己的块运行该函数指针并将其提供给第三方.我似乎无法找到一种方法 - 如何生成一个块,其中包含运行哪个函数的信息,然后将其提供给第三方.也许还有另一种选择吗?
编辑:将函数放在一个全局变量可能会有效,但我希望能够拥有大量的函数,因为第三方API是异步的,我不希望它调用错误的回调.
我试过的代码:
typedef void (*DummyAction)(char * result);
typedef void (^DummyBlock)(char * result);
@interface FunctionToBlock : NSObject
{
DummyAction function;
DummyBlock block;
}
- (id) initWithFunction: (DummyAction) func;
- (DummyBlock) block;
@end
@implementation FunctionToBlock : NSObject
- (id) initWithFunction: (DummyAction) func {
if (self = [super init]) {
function = func;
block = ^(char * result) {
function(result);
};
}
return self;
}
- (DummyBlock) block {
return block;
}
@end …Run Code Online (Sandbox Code Playgroud) 我一直在寻找glibc的一些源代码,特别是nptl代码,我发现它有点难以理解,因为它似乎有我不熟悉的约定.
例如,我正在查看一个非常小的文件pthread_equal.c,我有一些问题:
22 int
23 __pthread_equal (thread1, thread2)
24 pthread_t thread1;
25 pthread_t thread2;
26 {
27 return thread1 == thread2;
28 }
29 strong_alias (__pthread_equal, pthread_equal)
Run Code Online (Sandbox Code Playgroud)
第22和23行的声明看起来像我理解的东西.它的返回类型是int函数名__pthread_equal和参数列表(thread1, thread2).但第24 pthread_t thread1;和25 行的声明pthread_t thread2;是什么?看起来这些被声明为全局变量,但我不明白其目的.我在nptl目录中的许多文件中都看到过这种模式,并且无法弄清楚为什么会这样做.
什么是strong_alias?快速谷歌搜索有使用这个的例子,但我没有找到任何文档的链接.
什么是用作序两个下划线一些名字的原因__,有些用一个下划线_.我见过的大多数代码使用了两个下划线,但我想我已经看到了一些使用下划线的地方.例如在pthreadP.h中
556 /* Old cleanup interfaces, still used in libc.so. */
557 extern void _pthread_cleanup_push (struct _pthread_cleanup_buffer *buffer,
558 void (*routine) (void *), void *arg);
559 extern void …Run Code Online (Sandbox Code Playgroud)我意识到,这可能是偏好的问题,但我注意到,在很多代码样本中我见过的变量名称具有前缀g_,s_,m_,或只_.这是一种普遍接受的做法,这些前缀是什么意思?还有其他人会很高兴知道吗?
我试图了解开发人员何时需要C使用前面的'_' 定义变量.它是什么原因?
例如:
uint32_t __xyz_ = 0;
Run Code Online (Sandbox Code Playgroud) 我在无数的C/C++头文件和源文件中看到了这一点.
除个人偏好外,这些不同符号的含义是什么?
_NAME__NAME_NAME___NAME__NAME_t老实说,我唯一能理解的是_NAME,这是一个班级的私人成员(至少在C#中是这样).
有人可以解释他们之间的区别吗?
如果有任何其他明显的符号,请提及它们(即使是其他类似的语言).
谢谢!
#define宏的标准需要现代C++编译器__cplusplus.
这通常用在C和C++都可以使用的文件中,但实现略有不同.
但是在C(和C++)中,在标识符中使用任何双下划线的行为是未定义的!
因此,如果C编译器看到类似的东西
#ifdef __cplusplus
那么行为是不确定的?
所以我有两个结构体,为了简单起见,我们将它们称为A和B。A包含一个指向 的指针B,并B包含一个A。所以这里是代码:
啊
#ifndef A_H
#define A_H
#include "b.h"
typedef struct _A {
B *b;
} A;
#endif
Run Code Online (Sandbox Code Playgroud)
哈
#ifndef B_H
#define B_H
#include "a.h"
typedef struct _B {
A a;
} B;
#endif
Run Code Online (Sandbox Code Playgroud)
现在的问题是,当我从我的主 c 文件中导入 ah 时,我收到关于 A 是如何从 bh 未知类型的错误我不知道如何解决这个问题。