C 我可以缩短重复使用的函数名吗?

C 我可以缩短重复使用的函数名吗?,c,formula,C,Formula,我有一个很长的公式,如下所示: float a = sin(b)*cos(c)+sin(c+d)*sin(d).... 有没有办法在C中使用s而不是sin来缩短公式,而不影响运行时间 如果我使用define,它会影响运行时吗 define通过在编译时执行基于文本的替换来工作。如果#定义s(x)sin(x),则在编译器有机会查看之前,C预处理器会将所有s(x)重写为sin(x) 顺便说一句,这种低级的文本搜索正是为什么define用于更复杂的表达式可能是危险的。例如,一个典型的陷阱是,如果您执行

我有一个很长的公式,如下所示:

float a = sin(b)*cos(c)+sin(c+d)*sin(d)....
有没有办法在C中使用
s
而不是
sin
来缩短公式,而不影响运行时间

如果我使用define,它会影响运行时吗

define
通过在编译时执行基于文本的替换来工作。如果
#定义s(x)sin(x)
,则在编译器有机会查看之前,C预处理器会将所有
s(x)
重写为
sin(x)


顺便说一句,这种低级的文本搜索正是为什么define用于更复杂的表达式可能是危险的。例如,一个典型的陷阱是,如果您执行类似于
#define times(x,y)x*y
的操作,那么
times(1+1,2)
将重写为
1+1*2
,计算结果为
3
,而不是预期的
4
。对于更复杂的表达式,如sin,最好使用它。

对于sin,至少有三个选项可以使用
s

使用预处理器宏:

#define s(x) (sin(x))
#define c(x) (cos(x))
float a = s(b)*c(c)+s(c+d)*c(d)....
#undef c
#undef s
请注意,宏定义会立即用
#unde
删除,以防止它们影响后续代码。此外,您还应该了解预处理器宏替换的基础知识,注意这样一个事实,即
c(c)
中的第一个
c
将展开,但第二个
c
将不会展开,因为像宏
c(x)
这样的函数仅在
c
后面紧跟
的位置展开

此解决方案对运行时没有影响

使用内联函数:

static inline double s(double x) { return sin(x); }
static inline double c(double x) { return cos(x); }
对于一个好的编译器,这对运行时没有影响,因为编译器应该将对
s
c
的调用替换为对
sin
cos
的直接调用,结果与原始代码相同。不幸的是,在这种情况下,
c
函数将与
c
对象冲突在示例代码中显示。您需要更改其中一个名称

使用函数指针:

static double (* const s)(double) = sin;
static double (* const c)(double) = cos;
有了一个好的编译器,这也不会对运行时产生任何影响,尽管我怀疑使用此解决方案的编译器可能会比以前的解决方案多出一些编译器无法优化代码。同样,您将与
c
发生名称冲突。请注意,使用函数指针会创建对
sin
cos
的直接调用,绕过C实现可能为其定义的任何宏。(C实现允许使用宏和函数来实现库函数,它们这样做可能是为了支持优化或某些功能。对于高质量的编译器,这通常是一个次要问题;直接调用的优化仍然应该是好的。)

不要这样做

多年来,数学家一直将三角函数缩写为sin、cos、tan、sinh、cosh和tanh喜欢使用他们最喜欢的并且通常是特殊的符号,因此将任何纸张放大许多页,这些已经成为相当标准的。即使是LaTeX也有类似于
\sin
\cos
,和
\tan
的命令

日本人在20世纪70年代发布科学计算器时使这些缩写不朽(简写可以很容易地放在按钮上),C标准库也采用了它们

如果你偏离了这一点,那么你的代码会立即变得难以阅读。这对于数学代码尤其有害,因为你无法立即看到错误实现的影响

但如果你必须,那么一个简单的

static double(*const s)(double) = sin;

就足够了。

double(*s)(double)=sin;
使用
#define
sin
缩短为
s
的唯一效果是使您的代码无法读取。您可以编写一个emac宏,在键入时为您编写
sin
,例如
CTRL+s
。在Vim中,您可以编写一次
sin
,然后使用
重复键入很多次都可以。我知道可能有理由不同意OP的编码风格,但这似乎是一个完全正确且切中要害的问题。我不明白为什么它应该被否决。不是否决,但我鼓励你重新考虑你的想法。重命名标准库函数可能会给未来的代码读者和主要用户造成混乱tainers。通过使用空格,并在必要时将其拆分为多行,使表达式更具可读性。宏替换替换预处理器标记,而不是文本。