小编PSk*_*cik的帖子

带有 extglob 的 Case 语句

使用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命令需要在外面?

bash

7
推荐指数
1
解决办法
657
查看次数

在Linux上访问main之外的主要参数

是否可以在Linux上访问除(通过共享库构造函数)main之外的参数而main不是通过解析/proc/self/cmdline

c linux elf

7
推荐指数
1
解决办法
2553
查看次数

用于附加字符串元数据的自定义 ELF 部分

我希望能够将一些字符串、易于提取的键值对与我的 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)可以防止我破坏某些东西?

linux gcc elf

7
推荐指数
1
解决办法
1948
查看次数

使用char *,unsigned char *和signed char *的别名

一个char *(合格的变体)可以别名任何东西。是signed char *unsigned char *(和他们的合格变种)从此免除?

换句话说,如果我不希望restrictchar*函数参数用作其他类型的指针参数的别名(因为它们可以对它们进行别名),则将其应用于函数参数是一个好主意:

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)

c strict-aliasing

7
推荐指数
1
解决办法
459
查看次数

在Linux上开始堆栈

我以为我可以通过在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次运行中获得了以下偏移分布: …

c linux memory

7
推荐指数
1
解决办法
119
查看次数

我怎么在bash中source_once?

什么是bash中一次采购的好方法.

bash是否存储已经获取的文件的路径,或者我是否需要使所有source/ .调用通过将存储这些路径的包装器?

是否有一个标准可用的机制可以找到源参数解析的内容?which除非文件是可执行的,否则似乎不起作用.

bash

6
推荐指数
1
解决办法
99
查看次数

调整模板提供的基类

如果基类没有提供方法,你将如何填写方法?如果提供的话,我想重用基类方法.

例如:

#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)

c++ c++11

6
推荐指数
1
解决办法
166
查看次数

通过实现定义的宏识别clang,gcc和tcc

我使用clang,, gcctcc,我希望能够区分共同标题中的三个.

从他们的宏观转储来看,我预计宏的存在 __clang__将唯一地识别铿锵声.

我无法获得宏转储tcc($compiler -x c -E -dM /dev/null在其情况下不起作用).

什么是唯一标识gcc(可能还有tcc)的宏(如果有的话)?

c macros gcc clang tcc

6
推荐指数
1
解决办法
193
查看次数

优化辅助函数

这或多或少是一个关于使用示例代码将函数指针转换为另一个类型的澄清请求

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)

所以我的问题是:标准中是否有任何东西阻止编译器消除帮助?

c function-pointers callback language-lawyer

6
推荐指数
1
解决办法
106
查看次数

函数上的存储类说明符不一致

我有

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吗?为什么或者为什么不?

c language-lawyer

6
推荐指数
1
解决办法
187
查看次数