我有一个没有成员的结构(目前),我想知道是否有可能抑制我得到的警告:
warning: struct has no members
Run Code Online (Sandbox Code Playgroud)
是否可以添加成员并保持sizeof结构为零?还有其他方法吗?
我正在寻找将构建目录(与我的源目录,git存储库不同)添加到gcc的包含路径的好方法,以便在此期间看到经典的"config.h"文件以实现可移植性.汇编.
我有一个C函数,它将一个函数指针作为参数,它是一个析构函数,我将在程序结束时调用它.这是我的功能原型:
int store_dest(void (*routine)(void *));
Run Code Online (Sandbox Code Playgroud)
我想将此函数指针存储到具有其他一些信息的结构中.为了有一个很好的结构,我希望有一个typedef到这个函数指针.这是我的typedef:
typedef void (*my_destructor)(void *);
Run Code Online (Sandbox Code Playgroud)
这是我的结构:
typedef struct my_struct{
my_destructor dest;
other_info ...
} my_struct;
Run Code Online (Sandbox Code Playgroud)
在初始化步骤中,我想将"dest"字段设置为我的函数,这里是这个函数的原型:
void* my_dummy_dest(void* foo);
Run Code Online (Sandbox Code Playgroud)
当我尝试将结构的"dest"字段设置为"my_dummy_dest"时,会出现问题(事实上它只是一个警告,但我想抑制它):
my_struct.dest = &my_dummy_dest;
Run Code Online (Sandbox Code Playgroud)
我得到一个"警告:从不兼容的指针类型分配"
当我只是比较它们时相同:
if (my_struct.dest == &my_dummy_dest)
Run Code Online (Sandbox Code Playgroud)
我得到一个"警告:不同指针类型的比较缺少一个演员"
但是当我用另一个例程设置"dest"字段时,我没有得到任何警告.我不明白我有这些警告的原因.
我正在努力学习使用vimdiff.目前我想出了如何从缓冲区到另一个缓冲区(使用do)获取一个diff块,但我现在愿意做的是简单地在另一个缓冲区中获取一个块的一行(或某些行).
该vimdiff文件说:
:[range]diffget
Run Code Online (Sandbox Code Playgroud)
但我无法想象如何使用正确的范围参数来简单地将我从缓冲区中的行复制到另一个缓冲区.
我想知道我是否可以得到一个gcc选项列表,可能导致gdb表现得很奇怪.
当然,我们都知道使用优化选项(例如-O3)会导致gdb中出现奇怪的行为,但是其他可以产生这种影响的选项是什么?
(我目前正在尝试在gdb中运行mpeg2解码器,即使在删除优化标志后我也会出现奇怪的行为......)
我想知道我如何制作一个可移植的构建系统(一步一步),我目前使用cmake,因为它很容易设置,只有一个拱目标,但现在我必须打包我正在开发的库我想知道如何使它成为我正在测试的可移植的最佳方法.
我知道我需要一个config.h来定义取决于arch的东西,但我不知道它是多么自动化.
任何其他方式有一个构建系统是热烈欢迎!
我正在修改Xcode中预先存在的脚本来自定义我的文件头.脚本是Perl,它不是我最好的语言.:)
我只需要以dd/mm/yy格式在标题中插入当前日期.
这是我的脚本:
#! /usr/bin/perl -w
# Insert HeaderDoc comment for a header
#
# Inserts a template HeaderDoc comment for the header.
use strict;
# get path to document
my $headerPath = <<'HEADERPATH';
%%%{PBXFilePath}%%%
HEADERPATH
chomp $headerPath;
my $rootFileName = &rootFileNameFromPath($headerPath);
print "/*";
print " * $rootFileName\n";
print " * Project\n";
print " *\n";
print " * Created by Me on ";
# in bash it would be something like that :
# date +%d/%m/%y | awk '{printf "%s\n", …Run Code Online (Sandbox Code Playgroud) 我正在开发一个实现用户级线程的线程库(我有类似pthread_setscope的工作),我正在寻找一些测试,以避免为我实现的每个函数编写一个(互斥,条件等... )
有谁知道这样的事情?
我需要static void* array[1024];在库中有一个,我需要为每个条目设置为NULL.
我的问题是关于将整个数组设置为NULL memset (array, NULL, sizeof (void*) * 1024)的最佳方法,是最好的解决方案吗?
从pthread_key_create联机帮助页:
一个可选的析构函数可以与每个键值相关联。在线程退出时,如果键值具有非 NULL 析构函数指针,并且线程具有与键关联的非 NULL 值,则使用当前关联值作为其唯一参数调用指向的函数。如果一个线程退出时存在多个析构函数,则析构函数调用的顺序是不确定的。
如果在为所有具有关联析构函数的非 NULL 值调用了所有析构函数之后,仍有一些具有关联析构函数的非 NULL 值,则重复该过程。如果在至少 [PTHREAD_DESTRUCTOR_ITERATIONS] 次迭代析构函数调用未完成的非 NULL 值之后,仍然有一些非 NULL 值与关联的析构函数,则实现将停止调用析构函数。
我写了一个小例子,用一个简单的析构函数为非空线程特定值打印“Hello World”。据我所知,即使在第一次调用析构函数后线程特定值仍然不是 NULL,这个析构函数也只被调用一次(至少在 linux fedora 和 mac os x 上)。
我错过了什么吗?!(在 glibc 上 PTHREAD_DESTRUCTOR_ITERATIONS = 4。)
这是我的小例子:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NB_THREADS 1
#define NB_KEYS 1
static pthread_key_t keys[NB_KEYS];
static pthread_mutex_t mutex;
void destruction (void *arg)
{
(int) arg ++;
printf ("Destructor called! -- key value : %i\n", (int)arg);
}
void* startup_routine(void* argv)
{
int i;
int th …Run Code Online (Sandbox Code Playgroud) c ×6
cmake ×2
arrays ×1
build-system ×1
date ×1
destructor ×1
flags ×1
gcc ×1
gdb ×1
perl ×1
posix ×1
pthreads ×1
struct ×1
templates ×1
test-suite ×1
typedef ×1
unit-testing ×1
vim ×1
vimdiff ×1
warnings ×1