我从教育/黑客的角度来问这个问题,(我真的不想这样编码).
是否可以仅使用C预处理程序指令实现while循环.我知道宏不能递归扩展,那么如何实现呢?
有人知道任何C99预处理器魔法允许创建一个由另一个重复N次的字符串组成的字符串吗?
例如
STRREP( "%s ", 3 )
Run Code Online (Sandbox Code Playgroud)
变
"%s %s %s "
Run Code Online (Sandbox Code Playgroud)
经过预处理.
我能想到的唯一一件事就是这样
#define STRREP( str, N ) STRREP_##N( str )
#define STRREP_0(str) ""
#define STRREP_1(str) str
#define STRREP_2(str) str str
#define STRREP_3(str) str str str
...
Run Code Online (Sandbox Code Playgroud)
哪个效果很好,但是很难看,因为我必须手动为每个重复长度定义一个宏.我想与variadic宏一起使用它,宏返回这里显示的宏参数的数量.
为了使我的计算物理项目中的一个程序(不是由我编写)更加动态,我一直在努力实现C中非常简单的事情:在if条件下逐个元素地比较两个不同的数组.
#include <math.h>
#include <stdio.h>
#include "header.h"
const int nParam = 10;
double a[nParam], a_tmp[nParam];
double values[10000];
double FitParam(double x){
int xindex;
double value;
xindex=(int) x;
if (a_tmp[1]==a[1] && a_tmp[2]==a[2] && a_tmp[3]==a[3] && a_tmp[4]==a[4]){
value=values[xindex];
return(value);
}
// code continues... (very long subroutine and there is recursion for
// the subroutine so this if statement above is very important).
Run Code Online (Sandbox Code Playgroud)
每次运行程序时,数组a []都有不同数量的重要元素; 例如,现在,我们仅将这个子程序用于元素[1]到[4].但是,在其他情况下,我们希望分别拥有更少或更多的元素,例如最多3个元素或最多5个元素.
基本上,我希望能够重写上面的if语句,使其成为动态...换句话说,如果考虑了N个元素,那么它将会:
if (a_tmp[1]==a[1] && ... && a_tmp[N]==a[N]){}
因此,每当我们感兴趣的元素的数量N改变时,条件应该变化(N被定义为该文件的头部中的#define,我将其命名为header.h).
非常感谢您对此任务的支持.谢谢.
我想清理我的汇编代码并提供一种通过宏多次调用“NOP”的方法:
#define NOP() asm(" nop")
#define NOP_N( N ) \
NOP(); \
NOP(); \
.... call NOP() N times
Run Code Online (Sandbox Code Playgroud)
我无法确定这在宏中是否可行。
显然,出于性能原因,我不想要这样的东西:
#define NOP_N( n ) { register int i; for(i=0;i<n;i++) asm(" nop"); }
Run Code Online (Sandbox Code Playgroud)
这违背了 NOP 的目的:
L17: ; NOP_N(3);
nop
addi 1,r0 ; Unsigned
cmpi 3,r0
blo L17
Run Code Online (Sandbox Code Playgroud)
代码是C和汇编语言,所以这里不能涉及C++。此外,编译器相当陈旧,不支持可变参数宏......