相关疑难解决方法(0)

C++预处理器__VA_ARGS__参数个数

简单的问题,我无法在网上找到答案.在可变参数宏中,如何查找参数的数量?如果它有解决方案,我可以使用boost预处理器.

如果它有所不同,我试图转换可变数量的宏参数来增强预处理器序列,列表或数组以进行进一步的重新处理.

c c++ c-preprocessor variadic-macros

90
推荐指数
8
解决办法
10万
查看次数

C支持重载吗?

我只是想知道C是否支持过载?因为我们使用像printf这样的系统函数,它们具有不同的参数.帮帮我

c

56
推荐指数
5
解决办法
3万
查看次数

C中的伪泛型

我需要实现一些使用不同数字数组的方法.通常,我会使用泛型来完成这项工作,但由于C不提供它们,我现在正试图使用​​宏来模拟它们.

这是我正在尝试做的一个例子:

#ifndef TYPE
#define TYPE int
#endif

TYPE get_minimum_##TYPE (TYPE * nums, int len){
    TYPE min = nums[0];

    for (int i = 1; i < len; i++) {
        if (nums[i] < min) {
            min = nums[i];
        }
    }

    return min;
}
Run Code Online (Sandbox Code Playgroud)

但是,这不会编译.clang错误消息:

错误:预期';' 在顶级声明者之后

有没有办法在C中这样做?或者我需要手动为每种类型实现这个吗?

c generics c-preprocessor

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

C11 _Generic:如何处理字符串文字?

使用_GenericC11中的功能,您如何处理字符串文字?

例如:

#include <stdio.h>
#define foo(x) _Generic((x), char *: puts(x))

int main()
{
    foo("Hello, world!");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在clang上给出了这个错误:

controlling expression type 'char [14]' not compatible with any generic association type
Run Code Online (Sandbox Code Playgroud)

更换char *char[]给我

error: type 'char []' in generic association incomplete
Run Code Online (Sandbox Code Playgroud)

获得这个编译的唯一方法(据我所知)是:

  1. 将字符串文字转换为适当的类型.这是丑陋的(在我看来)首先打破了这一点_Generic.
  2. 使用char[14]的类型说明符.你一定在开玩笑吧......

我的假设是数组在传递时会衰减到指针_Generic,但显然不是.那么,如何我用_Generic用字符串文字?那是唯一的两种选择吗?

我在Debian上使用clang 3.2.不幸的是,它是我访问过的唯一支持此功能的编译器,所以我不知道它是否是编译器错误.

c clang c11

25
推荐指数
3
解决办法
2611
查看次数

C函数可以有多个签名吗?

可能重复:
C中的函数重载

抱歉,如果这是一个复制,但如果是,我找不到它.

在C中,您可以定义具有相同功能名称但具有不同参数的多个功能吗?我来自C#背景.在C#中,以下代码完全合法.

//我们的第一个功能

int MyFunction()
{
    //Code here
    return i;
}

int MyFunction(int passAParameter)
{
    // Code using passAParameter
    return i;
}
Run Code Online (Sandbox Code Playgroud)

在我的特定情况下,我想在参数列表的末尾创建一个具有一个可选参数(即int)的函数.可以这样做吗?

c function

20
推荐指数
2
解决办法
3万
查看次数

C11中多参数C函数的泛型

我理解单参数函数的C11泛型,如下所示:(从这里)

#define acos(X) _Generic((X), \
    long double complex: cacosl, \
    double complex: cacos, \
    float complex: cacosf, \
    long double: acosl, \
    float: acosf, \
    default: acos \
    )(X)
Run Code Online (Sandbox Code Playgroud)

但是,对于具有两个参数的函数来说似乎很痛苦,你需要嵌套调用_Generic,这真的很难看; 摘自同一篇博客:

#define pow(x, y) _Generic((x), \
long double complex: cpowl, \

double complex: _Generic((y), \
long double complex: cpowl, \
default: cpow), \

float complex: _Generic((y), \
long double complex: cpowl, \
double complex: cpow, \
default: cpowf), \

long double: _Generic((y), \
long double complex: …
Run Code Online (Sandbox Code Playgroud)

c c11

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

是否可以创建一个函数而不是两个具有相同目的但不同参数类型的函数?(我可以删除重复的代码吗?)

是否可以创建一个函数而不是两个具有相同目的但不同参数类型的函数?

我有两个用C编写的函数,它们将图像从RGB转换为HSV:

void png_rgb2hsv(pPNG_DATA data);
void jpg_rgb2hsv(pJPEG_DATA data);
Run Code Online (Sandbox Code Playgroud)

它们完全相同:它们采用数据 - > row_pointers并将其循环到循环数据 - >高度时间.然后它转换data-> row_pointers引用的值.这是它的工作原理.但唯一的区别是数据结构使用不同的类型.对于同样的事情,使用两个函数似乎毫无意义.特别是当我为更多色彩空间添加更多功能时.

如何在C的实践中解决这个程序设计问题?

更新: 大多数读者都不理解这个问题.我没有问过重载.这是关于设计的问题.我问是否可以删除冗余功能,"冗余"代码.因为两个函数都使用相同的代码,所以做同样的事情,但函数参数中的类型是不同的,因为一个类型来自libjpeg而第二个类型来自libpng.我发现它是不可能的,因为它意味着将一个变量用于两种不同的类型.

c

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

通过优化,使用C,gcc,C99和宏改进微控制器的简约OOP

我经常用C编程微控制器,因为C++编译器通常不可用,或者由于各种错误而无法制作极小的代码.但是,为了便于维护,OOP"语法糖"通常非常方便,因为它可以更加清晰地封装硬件程序.所以我想知道是否有办法在C中进行OOP语法,尽可能使OOP开销(在不需要时)以可移植的方式进行优化.例如:这将针对不同微控制器针对gcc进行优化,或者如果gcc不适用于该微控制器,则可能使用gcc的预处理器和通用ANSI-C编译器.

我发现只有线程,像这样,在C中进行OOP时,优雅的方式来模拟'this'指针?通常通过将指针嵌入到结构中来执行OOP,但这并不总是我想要的,因为当我对虚拟方法不感兴趣时​​,它会浪费内存,或类似的东西.我总是可以在需要这些功能的链接中遵循编码风格,但我想开发不需要它们的技术; 例如,我只是希望能够使用OOP范例进行编程,使用简单易懂的代码(不一定是C++,尽管我喜欢C++),并且当一些OOP范例不使用时仍然能够实现最小的C程序内存使用.

因此,我使用gcc和C99进行实验,因为一般来说gcc 3.2或更高版本适用于大多数平台; 并意识到我可以使用C99中的sizeof()和typeof()编译器函数自动索引类(来自未使用/未初始化的联合成员的"技巧")(所以类必须是带有子结构的联合),命令访问由宏创建的编译时常量查找表,它可以绑定数据和方法,并保证所有类型检查.等等

例如:GCC允许优化const结构和数组,当它们的成员只作为常量表达式访问时,所以我想我可以用它来构建一个基于宏的编译时绑定系统,其中处理OOP开销GCC实际上优化了最终的二进制文件.

使用这个系统,我现在可以进行可变宏方法调用,例如:M(a,init,"with","any","parameters",7)查找变量a的类型,调用方法init,使用变量number参数...

请参阅下面的代码示例,并尝试它们 - 它比解释简单:使用g​​cc -E查看宏扩展,并注意仅ANSI编译器,typeof()运算符必须替换为(void*)类型转换; 类型检查仅适用于GCC.

代码可以剪切并粘贴到文本编辑器中,文件名在第一行,它可以在普通的PC系统上编译和运行.

虽然我确实成功地摆脱了每个结构中的单个指针以"指回"一个类的方法列表,这可以节省有限内存微控制器中的内存,但我还是无法弄清楚如何让编译器进行优化out unused指针,因为我必须使用(void*)指针将类保存在数组中,这些指针需要一个内存地址(结构地址)和一个链接器实例; 并且不要优化.

所以:我想知道是否有人知道通过制作某种初始化的方法结构来改进我的解决方案的方法,该结构将在编译后优化(没有链接器地址),例如:当它的成员仅作为常量表达式访问时码.本质上,我需要能够在数组中查找元素,其中每个数组元素的初始化部分是不同的classXXX_mt,而不是所有类型为(void*)的classXXX_mt的地址列表.

如果有人能想到一个简单的解决方案,还有其他两个我需要帮助的改进; cpp(c-pre-processor)不允许通过标记连接从前一个宏中定义新的宏(据我所知),所以我必须制作固定长度的宏列表(在我的例子中最多10个) )持有类定义; 这意味着我在一个程序中最多只能有10个班级; 但理想情况下,我想要一种方法来使我的代码更通用,以便cpp可以动态创建可变长度列表.例如:问题与c预处理器无法自动"计数"有关.

其次,当我尝试为更新版本的GCC使用匿名结构时,我可能会删除访问ISO-C中的成员数据所需的额外"m",例如:foo.m.mydata,删除"m"从类联合定义中命名,并使用gcc -std = c11进行编译,然后它只是给了我错误声称结构定义没有...所以,即使在GCC 4.8中,联合内部的匿名结构也不起作用,尽管它应该; 我怎样才能让匿名结构起作用?

下面是我如何测试和实现包含文件voidbind.h的示例,该文件构建类列表并将方法静态链接到该类类型的变量.

最终,系统允许我像这个例子一样编程; 我用gcc 4.0到4.9编译没有问题:

//classtest.c
#ifndef MACROCHECK  // Don't macro expand stdio.h, it's ugly...
#include <stdio.h>  // to see macros, do gcc -D MACROCHECK -E classtest.c
#endif
#include "class1.h" // include example class, library.

#define _VOID_FINALIZE
#include "voidbind.h" // Make class list finalized, no …
Run Code Online (Sandbox Code Playgroud)

c oop gcc pointers

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

使用sizeof运算符可以很好地定义此代码吗?

#include <stdio.h>

void test(int arr[]);

int main ()
{
    int *arr[3];
    int ar1[2] = { 1, 2 };
    int ar2[3] = { 3, 4, 5 };
    int vla[ar2[1]];
    arr[0] = ar1;
    arr[1] = ar2;
    arr[2] = vla;

    for  (int i = 0; i < 3; i++)
    {
        test(arr[i]);
    }
}

void test(int arr[])
{
    printf("%zu\r\n", sizeof(arr));
}
Run Code Online (Sandbox Code Playgroud)

正如标题所说:这是有效的吗?如果是这样,有没有办法test()通过使用sizeof像数组一样输入的函数参数来输出不同的值?

c arrays sizeof

9
推荐指数
2
解决办法
520
查看次数

在纯C中打印void类型

我有一个像这样的功能

void printMe (void *i)
{
    printf("%d", i);
}
Run Code Online (Sandbox Code Playgroud)

我想传递一个无效指针并将其打印到屏幕上.上面的例子很好,如果i是整数,浮点数或双精度数,但如果我是一个char则崩溃.C中没有像我通常在C++中使用的那样重载.所以问题是这样,我们可以在C中创建一个函数来打印它作为参数的元素,如果是的话,这是怎么可能的,因为它在这一刻完全无法实现.

c printf type-conversion void

8
推荐指数
2
解决办法
3万
查看次数