Articles of macros

什么是WINAPI_FAMILY_ONECORE_APP?

我正在通过GitHub微软的OpenSSL端口。 一个提交引起了我的注意,那就是添加Win10通用平台支持 。 在提交中,出现了名为WINAPI_FAMILY_ONECORE_APP的分区。 不过,在search时我并没有find太多的东西。 英文有两首,中文有二十二首(见下)。 以下Visual Studio Tools for Windows 10 Preview中的新function提供了一些没有任何解释的准点符号: 新的API分区WINAPI_FAMILY_ONECORE_APP ARM 64 通用CRT … 我有两个问题: 什么是WINAPI_FAMILY_ONECORE_APP ,以及如何使用它? 我可以使用WINAPI_FAMILY_ONECORE_APP 检测Windows 10小工具上的Aarch64 / ARM64吗? 这里是微软在OpenSSL中的使用( 从ssl/dtls1.h ; C ++注释被移到了define的可读性之上): // winsock.h not present in WindowsPhone/WindowsStore, defining the expected struct here #if defined(WINAPI_FAMILY) && ( WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP || WINAPI_FAMILY==WINAPI_FAMILY_PC_APP || WINAPI_FAMILY==WINAPI_FAMILY_ONECORE_APP) struct next_timeout { long […]

在C预处理器中避免双重macros观replace

这是一个简单的小C程序,让我困惑了一会儿: #include <stdio.h> #define STR1(x) #x #define STR(x) STR1(x) int main(void) { printf("%s\n", STR(MYDEF)); } 这只是使用标准的string化双定义技术将stringMYDEF #define的值打印出来。 使用gcc -DMYDEF=abc prog.c编译(在Linux上)运行结果,并不奇怪,它打印出'abc'。 但是改变gcc -DMYDEF=linux prog.c的值,打印的结果不是'linux',而是'1'。 所以这让我困惑了一下,但是当然是因为gcc(在Linux上)发现了一个名为'linux'的内置的#define,其值为'1',而STR(x)macros最后将MYDEF扩展为“linux”,然后将linux扩展为“1”。 在我真正的程序中(这比上面的小testing要复杂得多),我用一种不同的(可能更好的)方式来处理这个事情,但是这让我好奇……是否有一个简单的小macros技术可以避免这个双重replace,并使程序打印出'linux'? 我知道我可以添加一个-U或#undef的Linux,但是这感觉有点笨拙。 我以为所有内置的#define都以下划线(通常是双下划线)开头,但我猜不是。

Linux内核链接列表

我正在尝试使用Linux内核链接列表实现,但我无法编译。 我完全不关心这些资源( http://www.roman10.net/linux-kernel-programminglinked-list/和http://kernelnewbies.org/FAQ/LinkedLists ) list.h内核macros为LIST_HEAD_INIT如下所示: #define LIST_HEAD_INIT(name) { &(name), &(name) } struct Node { int data; struct list_head list; }; struct Node mylinkedlist; LIST_HEAD_INIT(&mylinkedlist.list); void add(){ struct Node first; first.data = 1; first.list = LIST_HEAD_INIT(first.list); list_add_tail(&first->list, &mylinkedlist.list); return 0; } 我不断收到:“错误:预期的标识符或'('之前'{'”

什么是使用Linuxmacrosaccess_ok()

我一直在做一些研究,我对这个macros有点困惑。 希望有人能给我一些指导。 我有一些ioctl代码(我已经inheritance,没有写),如果在从用户空间复制数据之前检查access_ok()是否做了第一件事: #define __lddk_copy_from_user(a,b,c) copy_from_user(a,b,c) #define __lddk_copy_to_user(a,b,c) copy_to_user(a,b,c) long can_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { switch(cmd) { case COMMAND: if(! access_ok(VERIFY_READ, (void *)arg, sizeof(Message_par_t))) return(retval); if(! access_ok(VERIFY_WRITE, (void *)arg, sizeof(Message_par_t))) return(retval); argp = &Command; __lddk_copy_from_user( (void *) argp,(Command_par_t *) arg, sizeof(Command_par_t)); 所以代码工作得很好,但我不确定是否需要。 第一个问题来自access_ok返回的描述: 如果该区域可能可访问,该函数返回非零值(尽pipe访问可能仍然导致-EFAULT)。 这个函数简单地检查地址是否可能在用户空间中,而不是在内核中。 所以这意味着它确实没有什么更多的,然后确保我们检查的指针可能初始化在用户空间? 既然我们知道除了用户空间调用之外,我们不能进入这个函数,除非我们打开一个有效的文件描述符到这个设备,否则这是不可能发生的,这真的是需要的吗? 确实没有得到一个NULL指针是否真的更安全? 第二个问题来自这个描述: types参数可以指定为VERIFY_READ或VERIFY_WRITE。 […]

在gcc中有作为内置macros的非保留标识符的原因是什么?

今天我偶然发现了一个相当有趣的编译器错误: int main() { int const unix = 0; // error-line return unix; } 给gcc 4.3.2(是的,古老的)以下消息: error: expected unqualified-id before numeric constant 这绝对是相当混乱。 幸运的是,铿锵声(3.0)是一个更有帮助(像往常一样): error: expected unqualified-id int const unix = 0 ^ <built-in>:127:14: note: expanded from: #define unix 1 ^ 我当然没有想到unix ,它既不是大写字母,也不是从下划线开始,成为一个macros,特别是一个内置macros。 我检查了gcc中的预定义macros,并且有2个(在我的平台上)使用“非保留”符号: $ g++ -E -dM – < /dev/null | grep -v _ […]

Linux内核代码中的EXPORT_SYMBOL_GPL是什么?

Linux内核代码中的EXPORT_SYMBOL_GPL是什么? 下面是一段代码,其中包含EXPORT_SYMBOL_GPL 62 struct resource *platform_get_resource(struct platform_device *dev, 63 unsigned int type, unsigned int num) 64 { 65 int i; 66 67 for (i = 0; i < dev->num_resources; i++) { 68 struct resource *r = &dev->resource[i]; 69 70 if (type == resource_type(r) && num– == 0) 71 return r; 72 } 73 return NULL; […]

有没有一个macros定义来检查Linux内核版本?

我想知道是否有一个gccmacros会告诉我的Linux内核版本,所以我可以适当地设置variablestypes。 如果没有,我将如何去定义我自己的这个macros?

Windows有一个__declspec相当于Unix GCC的__attribute __((弱))?

我想导入一些C代码,但是重写它的main()函数。 我可以在Unix下用__attribute__((weak))预处理C代码的主要声明,但是这不会在Windows中编译,因为Strawberry Perl的GCC和MinGW的GCC都不能识别__attribute__((weak)) 。 在线阅读文档, __declspec似乎function相似。 是否有一个相当于Unix GCC的__attribute__((weak))macros的__declspec ? 这是我发布的早期问题的更具体的版本。

我想跟踪使用macros多参数始终为空的日志。 问题的c + +窗口

我正在使用以下方法来closures一个函数的时间: #define TIME_COST(message, …)\ char szMessageBuffer[2048] = {0};\ va_list ArgList;\ va_start(ArgList, message);\ vsprintf_s(szMessageBuffer, 2048, message, ArgList);\ va_end(ArgList); \ string strMessage(szMessageBuffer);\ CQLogTimer t(strMessage); // CQLogTimer是一个自我析构函数,它将自己的生命周期和打印szMessageBuffer。 但是,当我使用这个macros: void fun { TIME_COST("hello->%s", filePath); XXXXXX } 生成的消息总是hello – >(null) 任何人都可以帮忙吗? 非常感谢!

如何驯服Windows头文件(有用的定义)?

在这个问题的答案之一, NOMINMAX谈到有用的定义NOMINMAX ,可以防止不必要的定义最小/最大macros。 是否还有其他有用的定义可以帮助控制windows.h (或其他Windows头文件,例如Microsoft C运行时头文件或STL实现)的行为?