相关疑难解决方法(0)

如何在C中实现函数重载?

有没有办法在C中实现函数重载?我正在寻找简单的函数来重载像

foo (int a)  
foo (char b)  
foo (float c , int d)
Run Code Online (Sandbox Code Playgroud)

我认为没有直接的方式; 我正在寻找解决方法,如果存在的话.

c overloading

234
推荐指数
12
解决办法
18万
查看次数

如何让clang编译成llvm IR

我希望clang将我的C/C++代码编译为LLVM字节码而不是二进制可执行文件.我怎样才能做到这一点?如果我得到LLVM字节码,我怎么能把它进一步编译成二进制可执行文件.

基本上我想LLVM在编译成二进制可执行文件之前将一些自己的代码添加到字节码中.

c llvm clang

135
推荐指数
5
解决办法
8万
查看次数

C++中静态多态性背后的动机是什么?

我使用Curiously Recurring模板模式了解静态多态的机制.我只是不明白它有什么好处.

声明的动机是:

我们牺牲了动态多态性的一些灵活性来提高速度.

但是,为什么东西打扰这么复杂,如:

template <class Derived>
class Base
{
public:
    void interface()
    {
         // ...
         static_cast<Derived*>(this)->implementation();
         // ...
    }
};

class Derived : Base<Derived>
{
private:
     void implementation();
};
Run Code Online (Sandbox Code Playgroud)

当你可以做的时候:

class Base
{
public: 
    void interface();
}

class Derived : public Base
{
public: 
    void interface();
}
Run Code Online (Sandbox Code Playgroud)

我最好的猜测是代码中没有语义差异,这只是一个好的C++风格问题.

Herb Sutter写道Exceptional C++ style: Chapter 18:

更喜欢将虚拟功能设为私有.

当然伴随着彻底解释为什么这是好风格.

在本指南的上下文中,第一个例子是好的,因为:

void implementation()示例中的函数可以假装是虚拟的,因为它是在这里执行类的自定义.因此它应该是私人的.

第二个例子很糟糕,因为:

我们不应该干涉公共接口来执行自定义. …

c++ coding-style

37
推荐指数
1
解决办法
2万
查看次数

如何阻止g ++链接不需要的异常处理代码?

我正在使用为arm-eabi编译的GCC/G ++开发嵌入式应用程序.由于资源限制,我试图禁用标准C++异常处理.我正在使用"-fno-exceptions -nostartfiles -ffreestanding"编译代码.

当一个类的全局实例存在,并且该类包含另一个类的实例作为成员时,则链接了许多异常处理代码.这不会那么糟糕,除了它还带来了很多stdio的东西,比如printf,fopen,fclose和其他FILE函数.此应用程序没有文件系统,即使这样做,这些功能也会浪费太多代码空间.

我理解即使使用-fno-exceptions,G ++链接在使用异常的operator new中,因为库没有非异常使用的operator new(new(nothrow)除外).我为operator new和delete创建了替换,它们被链接到输出以及不需要的标准库函数.

令我困惑的是,我不会在任何地方打电话给新人.只有当一个全局对象包含另一个对象时才会链接所有这些代码.

例如:

class UartA {
...
private:
  Ringbuffer* rxbuf;
};

class UartB {
...
private:
  Ringbuffer rxbuf;
};
Run Code Online (Sandbox Code Playgroud)

如果创建了UartA的全局实例,则不会链接异常处理,operator new和stdio内容.这就是我想要的.

如果创建了UartB的全局实例(其中rxbuf是实例而不是指针),则链接不需要的代码.

UartA和UartB都不使用operator new,exception或stdio.它们的区别仅在于rxbuf的类型.

你能建议如何防止链接额外的代码吗?另外,为什么这与UartB相关联,而不是UartA?

c++ gcc g++ exception

5
推荐指数
2
解决办法
6894
查看次数

如何将llvm IR转换为c代码?

有没有办法将llvm IR转换为c代码并保持其语义?例如,我们可以先将c代码编译为llvm IR,然后将其编译回另一段c代码.我不希望这两个文件是一样的.但他们需要具有相同的功能.谢谢

llvm

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

是否有一种不是 C++ 的“带有类的 C”语言?

我正在寻找某种尽可能简约C但具有内置类支持的 C 方言。C因此,我可以(并鼓励)使用宏、指向数组的指针和手动内存管理,还可以创建类、向它们添加字段和成员函数等。当我尝试在andtypedef struct和函数指针中实现某种 OOP 时,出现了这个问题与我想要的类似,但是“成员函数”需要手动将指向对象的指针作为参数传递给它们,而这不是我想要做的。C++我知道我可以像“带有类的 C”一样写,但是我C++会鼓励不同的编程风格,我很好奇是否有一些东西正是我想要的。

我正在搜索“带有类的 C”,但我只C++在结果中看到,所以我希望答案是“只使用 C++”,我对此表示同意,但我只是好奇。

c oop class dialect

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

在C中进行OOP时,优雅的方式来模拟'this'指针?

我想在C中使用多态进行一些面向对象的样式编程,其中我的接口类包含一个指向函数表的指针.例如:

/* Implement polymorphism in C, Linux kernel-style */
struct statement {
    const struct statement_ops *ops;
    struct list_head list;      /* when on master input list */
    void *private;          /* pointer to type-specific data */
};

struct statement_ops {
    int (*analyse)(void *private, int pc);
    int (*get_binary_size)(void *private);
};

void user(void)
{
    struct statement *s = make_a_statement();
    if (s->ops->analyse(s->private, foo))
        blah blah;
}
Run Code Online (Sandbox Code Playgroud)

我希望能够在没有明确地将s-> private传递给每个"方法"的情况下编写内容.有任何想法吗?一些宏观技巧可能吗?

c oop polymorphism

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

标签 统计

c ×4

c++ ×2

llvm ×2

oop ×2

clang ×1

class ×1

coding-style ×1

dialect ×1

exception ×1

g++ ×1

gcc ×1

overloading ×1

polymorphism ×1