如果您有一个静态分配的数组,Visual Studio调试器可以轻松显示所有数组元素.但是,如果您有一个动态分配并由指针指向的数组,那么当您单击+以展开它时,它将仅显示该数组的第一个元素.是否有一种简单的方法来告诉调试器,将这些数据显示为Foo类型和X大小的数组?
今天我不得不使用这个basename()功能,而man 3 basename(这里)给了我一些奇怪的信息:
笔记
有两个不同版本的basename() - 上面描述的POSIX版本,以及GNU版本,后者可以使用
#define _GNU_SOURCE
#include <string.h>
我想知道这#define _GNU_SOURCE意味着什么:它是否污染了我用GNU相关许可证编写的代码?或者它只是用于告诉编译器类似" 嗯,我知道,这组函数不是POSIX,因此不可移植,但我还是想用它 ".
如果是这样,为什么不给人们不同的标题,而不是必须定义一些模糊的宏来获得一个函数实现或另一个?
有些东西也让我感到困惑:编译器如何知道哪个函数实现与可执行文件链接?它也使用这个#define吗?
有人有一些指示可以给我吗?
我正在尝试创建一个用Go程序编写的静态对象与C程序(比如内核模块或其他东西).
我已经找到了关于从Go调用C函数的文档,但是我没有找到关于如何走另一条道路的文档.我发现它是可能的,但很复杂.
这是我发现的:
有任何人对此有经验吗?简而言之,我正在尝试创建一个完全用Go编写的PAM模块.
我最近一直在思考如何在C(而不是 C++)中进行函数式编程.显然,C是一种过程语言,本身并不真正支持函数式编程.
是否有任何编译器/语言扩展可以为语言添加一些函数式编程结构?GCC提供嵌套函数作为语言扩展; 嵌套函数可以从父堆栈框架访问变量,但距离成熟的闭包还有很长的路要走.
例如,我认为在C中真正有用的一件事是,在任何需要函数指针的地方,你都可以传递一个lambda表达式,创建一个衰变为函数指针的闭包.C++ 0x将包含lambda表达式(我觉得很棒); 但是,我正在寻找适用于直C的工具.
[编辑]为了澄清,我不是试图解决C中更适合函数式编程的特定问题; 如果我想这样做,我只是想知道那里有什么工具.
在最近的代码审查中,贡献者试图强制执行NULL对指针的所有检查以下列方式执行:
int * some_ptr;
// ...
if (some_ptr == NULL)
{
// Handle null-pointer error
}
else
{
// Proceed
}
Run Code Online (Sandbox Code Playgroud)
代替
int * some_ptr;
// ...
if (some_ptr)
{
// Proceed
}
else
{
// Handle null-pointer error
}
Run Code Online (Sandbox Code Playgroud)
我同意他的方式更明确,因为它明确地说"确保这个指针不是NULL",但我会反驳说,任何正在研究这个代码的人都会明白在一个指针变量中使用指针变量if声明是隐式检查NULL.另外我觉得第二种方法引入类似错误的可能性较小:
if (some_ptr = NULL)
Run Code Online (Sandbox Code Playgroud)
这对于查找和调试来说只是一种绝对的痛苦.
您更喜欢哪种方式?为什么?
有一个变量,它包含一些标志,我想删除其中一个.但我不知道如何删除它.
这是我如何设置标志.
my.emask |= ENABLE_SHOOT;
Run Code Online (Sandbox Code Playgroud) 例如,我有这个
char *buff = "this is a test string";
Run Code Online (Sandbox Code Playgroud)
并希望得到"test".我怎样才能做到这一点?
以下声明之间有什么区别?
char * const a;
const char * a;
Run Code Online (Sandbox Code Playgroud)
为了理解我写这个小程序的区别:
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char **argv)
{
char a = 'x';
char b = 'y';
char * const pc1 = &a;
const char * pc2 = &a;
printf ("Before\n");
printf ("pc1=%p\n", pc1);
printf ("*pc1=%c\n", *pc1);
printf ("pc2=%p\n", pc2);
printf ("*pc2=%c\n", *pc2);
*pc1 = b;
/* pc1 = &b; */
/* *pc2 = b; */
pc2 = &b;
printf ("\n\n");
printf ("After\n");
printf ("pc1=%p\n", pc1);
printf ("*pc1=%c\n", …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个程序,其中一些函数的名称依赖于某个宏变量的值,宏如下:
#define VARIABLE 3
#define NAME(fun) fun ## _ ## VARIABLE
int NAME(some_function)(int a);
Run Code Online (Sandbox Code Playgroud)
不幸的是,宏NAME()将其转化为
int some_function_VARIABLE(int a);
Run Code Online (Sandbox Code Playgroud)
而不是
int some_function_3(int a);
Run Code Online (Sandbox Code Playgroud)
所以这显然是错误的方式.幸运的是,VARIABLE的不同可能值的数量很小所以我可以简单地做一个#if VARIABLE == n并单独列出所有情况,但我想知道是否有一个聪明的方法来做到这一点.