我不时会读到Fortran是或者可以比C更快进行繁重的计算.这是真的吗?我必须承认我几乎不知道Fortran,但到目前为止我见过的Fortran代码并没有表明该语言具有C所没有的功能.
如果是真的,请告诉我原因.请不要告诉我哪些语言或库对数字运算有好处,我不打算写一个app或lib来做那个,我只是很好奇.
有没有办法对相同类型的typedef强制执行显式转换?我要处理utf8,有时我会对字符数和字节数的索引感到困惑.所以有一些typedef很好:
typedef unsigned int char_idx_t;
typedef unsigned int byte_idx_t;
Run Code Online (Sandbox Code Playgroud)
除此之外,您需要在它们之间进行显式转换:
char_idx_t a = 0;
byte_idx_t b;
b = a; // compile warning
b = (byte_idx_t) a; // ok
Run Code Online (Sandbox Code Playgroud)
我知道C中不存在这样的功能,但也许你知道一个技巧或编译器扩展(更好的gcc).
编辑 我仍然不喜欢一般的匈牙利符号.由于项目编码惯例,我无法将它用于此问题,但我现在在另一个类似的情况下使用它,其中类型相同且含义非常相似.我不得不承认:它有所帮助.我永远不会用起始"i"来声明每个整数,但是就像Joel的重叠类型的例子一样,它可以挽救生命.
我总是尽量避免返回字符串文字,因为我担心它们不是在函数之外定义的.但我不确定是不是这样.我们来看一下这个函数:
const char *
return_a_string(void)
{
return "blah";
}
Run Code Online (Sandbox Code Playgroud)
这是正确的代码吗?它确实适用于我,但也许它只适用于我的编译器(gcc).所以问题是,do(string)文字有一个范围,或者它们是否一直存在/定义.
为什么没有c标准的memswap函数,可能看起来像:
int memswap(void *ptr1, void *ptr2, size_t nbytes)?
Run Code Online (Sandbox Code Playgroud)
我知道写起来很容易,但我认为libc可以做一些很棒的技巧来加速它,就像一些实现为memcpy做的那样.
我使用函数指针的结构来实现不同后端的接口.签名非常不同,但返回值几乎都是void,void*或int.
struct my_interface {
void (*func_a)(int i);
void *(*func_b)(const char *bla);
...
int (*func_z)(char foo);
};
Run Code Online (Sandbox Code Playgroud)
但是后端不需要支持每个接口函数的功能.所以我有两种可能性,第一种选择是在每次调用之前检查指针是否为NULL.我不太喜欢这样,因为可读性和因为我担心性能影响(但我没有测量它).另一种选择是具有虚函数,对于极少数情况,接口函数不存在.
因此,我需要为每个签名都使用一个虚函数,我想知道是否有可能只有一个用于不同的返回值.并将其转换为给定的签名.
#include <stdio.h>
int nothing(void) {return 0;}
typedef int (*cb_t)(int);
int main(void)
{
cb_t func;
int i;
func = (cb_t) nothing;
i = func(1);
printf("%d\n", i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我用gcc测试了这段代码,它确实有效.但它是否理智?或者它可以破坏堆栈还是会导致其他问题?
编辑:感谢所有答案,经过一番深入阅读后,我现在学到了很多关于调用约定的知识.并且现在可以更好地理解引擎盖下发生的事情.
我有一个包含另一个结构的数组的结构,它看起来像这样:
typedef struct bla Bla;
typedef struct point Point;
struct point
{
int x, y;
};
struct bla
{
int another_var;
Point *foo;
};
Run Code Online (Sandbox Code Playgroud)
我现在想在全球范围内初始化它们.它们旨在作为模块的描述.我尝试用c99复合文字做到这一点,但编译器(gcc)不喜欢它:
Bla test =
{
0, (Point[]) {(Point){1, 2}, (Point){3, 4}}
};
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
error: initializer element is not constant error: (near initialization for 'test')
由于我不需要修改它,我可以根据需要在其中加入尽可能多的"const".有没有办法编译它?
我正在写一个小库,你可以在其中设置范围;起点和终点是双精度的。该库具有该范围的一些内置或计算的默认值,但是一旦通过范围设置函数设置了它们,就无法返回到默认值。
因此我喜欢做的就是使用NaN值作为使用默认值的指示符,但是我没有找到NaN的任何标准定义,并且阅读gcc手册它说有不支持NaN的平台。
我的问题是:
是否有不使用 IEEE 754 浮点数的最新平台?我不关心一些模糊的嵌入式设备,因为该库专注于带有 GUI 的平台,准确地说是 cairo。
第二个问题你会使用 NaN 值作为参数来达到这样的目的吗?我在标题中的某个位置定义它没有问题。