小编Kam*_*Cuk的帖子

如何减少二维 _Generic 中第二个参数的扩展次数?

我有以下代码:

int add_ii(int a, int b) { return a + b; }
unsigned add_iu(int a, unsigned b) { return a + b; }
unsigned add_ui(unsigned a, int b) { return a + b; }
unsigned add_uu(unsigned a, unsigned b) { return a + b; }

#define add(LEFT, RIGHT) \
    _Generic(LEFT \
        ,int: _Generic(RIGHT \
           ,int:      add_ii \
           ,unsigned: add_iu \
        ) \
        ,unsigned: _Generic(RIGHT \
           ,int:      add_ui \
           ,unsigned: add_uu \
        ) \
    )(LEFT, RIGHT)

int main() {
     return add(1, …
Run Code Online (Sandbox Code Playgroud)

c generics c11

5
推荐指数
1
解决办法
142
查看次数

如何记住哪个扩展 ${var%} ${var#} 从哪一端开始工作?

我很难记住哪一个参数扩展${var%subst}${var#subst}从字符串的前面删除,哪一个从字符串的后面删除。例子:

$ var=/a/b/c
$ echo dirname=${var#/*} filename=${var%%*/}
dirname=a/b/c filename=/a/b/c                      # Wrong!
$ echo dirname=${var%/*} filename=${var##*/}
dirname=/a/b filename=c
Run Code Online (Sandbox Code Playgroud)

我总是将它们混合在一起,最终要么编写一些测试命令,要么查看手册。很容易记住%%删除 more then %,因为then%%是一个更长的字符串%,2 个字符 vs 1 个字符,与##vs相同#。但我总是%#.

是否有内存规则可以知道字符串的哪一端%#从哪一端删除?

bash shell parameter-expansion

4
推荐指数
4
解决办法
135
查看次数

如何静态防止 str == enum 比较?

我经常犯以下错误:

import enum

class StatusValues(enum.Enum):
    one = "one"
    two = "two"

def status_is_one(status: str):
    return status == StatusValues.one
Run Code Online (Sandbox Code Playgroud)

String 永远不会是枚举类。问题是它应该是StatusValues.one.value

是否有一个strcmp(status, StatusValues.one)-ish 函数,以便我的pyright在我将字符串与类进行比较时会出错?有没有好的方法来防止此类错误?

python enums python-3.x python-3.7

4
推荐指数
1
解决办法
118
查看次数

C 标准对 extern const 有何规定

考虑以下程序

\n
extern const int foo;\nextern void blah(void);\n\nint toto(void) {\n  int x = foo;\n  blah();\n  int y = foo;\n  return x + y;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

arm-linux-gnueabihf-gcc -std=c99 -O2 -fno-pic -S extern_const2.c将其编译为

\n
toto:\n    @ args = 0, pretend = 0, frame = 0\n    @ frame_needed = 0, uses_anonymous_args = 0\n    movw    r3, #:lower16:foo\n    movt    r3, #:upper16:foo\n    push    {r4, lr}\n    ldr r4, [r3]\n    bl  blah\n    lsls    r0, r4, #1\n    pop {r4, pc}\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,foo被读取一次,然后左移 1,这意味着假设gcc其值在函数调用期间保持不变。观察到类似的行为 …

c standards language-lawyer

4
推荐指数
1
解决办法
238
查看次数

用于计算斐波纳契数的螺纹程序

嘿大家.我正在尝试用C++编写一个程序来计算Fibonacci系列.我创建了一个执行计算和输出的线程.但是我的for循环中没有任何东西似乎被执行了.任何人都可以查看我的代码并告诉我我可能做错了什么?

#include <iostream>
#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>

using namespace std; 

//iterative with output
DWORD WINAPI fib3(LPVOID param){
double u = 0; 
double v = 1;
double t; 
int upper = *(int*)param;

for(int i = 2; i <= upper; i++){
    cout << v << " "; 
    t = u + v; 
    u = v; 
    v = t; 
    cout << "testing" << endl; 
}
    cout << v << " "; 
    return 0; 
}

int main(int argc, char *argv[]){

cout << …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading fibonacci

3
推荐指数
1
解决办法
2341
查看次数

c ++中的冲突声明

我有一个cpp文件如下:

#include <iostream> 

#include "i.h"

using namespace std; 

typedef struct abc{
int a1;
int b1;
} abc_t, *abc;

void fun(abc x){
cout<<x->a1;
}

int main(){
abc val;
fun(val);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

ih文件:

struct abc;

void fff(struct abc);
Run Code Online (Sandbox Code Playgroud)

当我编译代码时出现以下错误:

t.cpp:8: error: conflicting declaration ‘typedef struct abc* abc’

t.cpp:5: error: ‘struct abc’ has a previous declaration as ‘struct abc’

t.cpp: In function ‘void fun(abc)’:

t.cpp:11: error: base operand of ‘->’ has non-pointer type ‘abc’
Run Code Online (Sandbox Code Playgroud)

如果我将cpp文件保存为c文件并使用c编译器进行编译,那么一切正常.c ++编译器有什么问题?

c++ struct typedef

0
推荐指数
1
解决办法
3137
查看次数

在C中初始化包含函数指针的结构

结构box的定义box.h如下:

typedef struct box {
    int (*func1) (const void *p1, const void *p2);
    void (*func2) (void *p3);
} Box;
Run Code Online (Sandbox Code Playgroud)

box.c包括box.h并具有以下功能:

int create_box(int (*func1)(const void *p1, const void *p2), void (*func2)(const void *p3), Box **box) {
Run Code Online (Sandbox Code Playgroud)

create_box根据提供的参数被调用以初始化一个盒子。我正在努力弄清楚如何将提供的函数指针分配给结构的字段。首先,我首先通过分配内存给**boxvia(*box) = malloc(sizeof(Box));

但是,然后我尝试通过分配函数指针的参数

(*box)->func1 = (func1)(&p1, &p2);
(*box)->func2 = (func2)(&p3);
Run Code Online (Sandbox Code Playgroud)

运行此命令将告诉我所有指针均未声明。显然,我对函数指针的工作方式有误解,但是我不明白我应该如何初始化它们(如果这就是写词)。我试着更换右侧(*func1)(*p1, *p2)(func1)(p1, p2)(*func1)(p1, p2)(*func1)(&p1, &p2),等但他们没有得到任何东西,我能理解。如何正确初始化此结构的函数指针?

如果相关的话,我正在C90工作。

c struct function-pointers c89

0
推荐指数
1
解决办法
53
查看次数