使用extglob,我想匹配一个变量
*( )x*
Run Code Online (Sandbox Code Playgroud)
(在正则表达式:/^ *x.*/)
这个:
main(){
shopt -s extglob
local line=' x bar'
case "$line" in
*( )x*) ;;
*) ;;
esac
}
main "$@"
Run Code Online (Sandbox Code Playgroud)
给我一个语法错误。要么除去extglob括号或移动shopt -s extglob之外main,到外范围,解决了这个问题。为什么?为什么shopt -s extglob命令需要在外面?
是否可以在Linux上访问除(通过共享库构造函数)main之外的参数而main不是通过解析/proc/self/cmdline?
我希望能够将一些字符串、易于提取的键值对与我的 ELF 可执行文件关联起来。
我注意到 gcc 编译的 ELF 有一个.comment部分
$ readelf -p .comment a.out
Run Code Online (Sandbox Code Playgroud)
所以我尝试复制这一点:
主要.c:
#include <stdio.h>
int main(){ puts("Hello world"); return 0; }
const char str[] __attribute__((section(".meta"))) = "hello meta world";
Run Code Online (Sandbox Code Playgroud)
测试:
$ readelf -p .meta a.out
String dump of section '.meta':
[ 0] hello meta world
Run Code Online (Sandbox Code Playgroud)
或者
$ readelf -p .meta a.out | sed -n 's/^[^]]*] //p'
hello meta world
Run Code Online (Sandbox Code Playgroud)
这有效。
是否有更好的方法将此类字符串键值对附加到 ELF 文件(而不将其分解为多个文件)?用户部分是否有一个命名空间(例如.user.meta)可以防止我破坏某些东西?
一个char *(合格的变体)可以别名任何东西。是signed char *和unsigned char *(和他们的合格变种)从此免除?
换句话说,如果我不希望restrict将char*函数参数用作其他类型的指针参数的别名(因为它们可以对它们进行别名),则将其应用于函数参数是一个好主意:
int func(struct foo *f, char * restrict s /*different object*/);
Run Code Online (Sandbox Code Playgroud)
可以restrict像这样删除带符号和无符号char变体的关键字吗?
int sfunc(struct foo *f, signed char *s /*different object*/);
int ufunc(struct foo *f, unsigned char *s /*different object*/);
Run Code Online (Sandbox Code Playgroud)
同样,指向相同类型的有符号和无符号变量的指针是否也可以互为别名?换句话说,如果我期望一个指向int的指针和一个指向unsigned的指针,并且它们应该指向不同的对象,则int *和unsigned *参数应该都被restrict限定吗?
/* i and u should be different */
int uifunc(int * /*restrict?*/ i, unsigned * /*restrict?*/ u);
Run Code Online (Sandbox Code Playgroud) 我以为我可以通过在main中获取变量的地址并向上舍入到页面边界来获得我的进程堆栈的开始(考虑到我的堆栈增长).
我将其与报告的边界进行了比较,/proc/self/maps并且它总是偏离1,2或3页(每页4096字节),从不偏移.差异随每次运行而变化,以下(混乱,非简约)管道中使用的此C程序证明了差异.
stacksz.c:
#include <stdlib.h>
#include <unistd.h>
#include <stdint.h>
#include <stdio.h>
#define CAT "cat /proc/XXXXXXXXXXX/maps"
#define CATP "cat /proc/%ld/maps"
#define MASK ((sizeof(char)<<12)-1)
int main()
{
uintptr_t top = (uintptr_t)&top + MASK & ~MASK;
char cat[sizeof CAT];
sprintf(cat,CATP,(long)getpid());
if(system(cat)) return 1;
printf(" %lx stack\n", top);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
bash管道:
gcc stacksz.c && echo "$(( $(./a.out |grep stack |tr '-' ' ' |cut -d' ' -f2 |sed 's/^/0x/'|tr '\n' -|sed 's/-$//') ))"
Run Code Online (Sandbox Code Playgroud)
我很好奇是否有人能解释这种现象.机器是Linux precision 4.15.0-43-generic #46-Ubuntu SMP x86_64.`(我在1000次运行中获得了以下偏移分布: …
什么是bash中一次采购的好方法.
bash是否存储已经获取的文件的路径,或者我是否需要使所有source/ .调用通过将存储这些路径的包装器?
是否有一个标准可用的机制可以找到源参数解析的内容?which除非文件是可执行的,否则似乎不起作用.
如果基类没有提供方法,你将如何填写方法?如果提供的话,我想重用基类方法.
例如:
#include <iostream>
struct Base0 { };
struct Base1 { void m() { std::cout<<"Base1\n"; } };
template<typename T>
struct Derived : public T {
//if T doesn't provide m, define it here, otherwise reuse the base class method
void m(){ /*? std::cout<<"Derived\n"; ?*/ }
};
int main(){
Derived<Base0> d0;
d0.m(); //should print "Derived"
Derived<Base1> d1;
d1.m(); //should print "Base1"
}
Run Code Online (Sandbox Code Playgroud) 我使用clang,, gcc和tcc,我希望能够区分共同标题中的三个.
从他们的宏观转储来看,我预计宏的存在
__clang__将唯一地识别铿锵声.
我无法获得宏转储tcc($compiler -x c -E -dM /dev/null在其情况下不起作用).
什么是唯一标识gcc(可能还有tcc)的宏(如果有的话)?
这或多或少是一个关于使用示例代码将函数指针转换为另一个类型的澄清请求
struct my_struct;
void my_callback_function(struct my_struct* arg);
void do_stuff(void (*cb)(void*));
static void my_callback_helper(void* pv)
{
my_callback_function(pv);
}
int main()
{
do_stuff(&my_callback_helper);
}
Run Code Online (Sandbox Code Playgroud)
答案说一个"好"的编译器应该能够优化my_callback_helper()函数,但是我发现在https://gcc.godbolt.org
上没有编译器来执行它并且辅助函数总是生成,即使它只是跳转到my_callback_function()( - O3):
my_callback_helper:
jmp my_callback_function
main:
subq $8, %rsp
movl $my_callback_helper, %edi
call do_stuff
xorl %eax, %eax
addq $8, %rsp
ret
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:标准中是否有任何东西阻止编译器消除帮助?
我有
static void static_func(void);
void static_func(void) { }
static inline void static_inline_func(void);
void static_inline_func(void) { }
#if 0 //error
void extern_func(void){}
static void extern_func(void);
#endif
int main()
{
static_func();
static_inline_func();
}
Run Code Online (Sandbox Code Playgroud)
我期待警告或错误,但是即使使用,gcc和clang也都没有做出任何警告-Wall -Wextra -pedantic。
这是合格的C吗?为什么或者为什么不?