C功能解析顺序

Ger*_*col 4 c function

我正在用C编写非破坏性转换例程,我刚刚意识到(至少在Visual C++中)函数是以相反的顺序解析的.

所以:

main()
{
char* psString[] = { "Hello", "World", "World2", "World3" };

printf("%s - %s - %s - %s\n", 
    H2A_N(psString[0]), 
    H2A_N(psString[1]), 
    H2A_N(psString[2]), 
    H2A_0(psString[3]));

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

我的代码不是可重入的,只能在一个线程中运行,因此我将使用静态字符数组来存储结果.

我的计划是有一个函数H2A_0,它将输出写入缓冲区的开头,并留下下一个地址,以便后续调用H2A_N.

我确实意识到这种方法有一些缺点,但是我必须将这个转换例程应用到很多现有代码中,所以越简单越好(我不想乱用释放内存).

我的问题是:

  1. 是否以相反顺序解析函数(当它们作为参数传递给其他函数时)是C标准的一部分.
  2. 有一个更好的方法吗?

Dav*_*nan 7

没有明确的参数评估顺序.编译器可以随意决定评估它们的顺序.

最新版本的标准C11就是这样说的,§6.5.2.2/ 10:

在评估函数指示符和实际参数之后但在实际调用之前有一个序列点.调用函数(包括其他函数调用)中的每个评估(在执行被调用函数体之前或之后没有特别顺序)在被调用函数的执行方面是不确定地排序的.

如果您希望强制执行特定的评估顺序,则需要将表达式从函数调用中拉出,并将它们保存到局部变量中.

int param1 = foo(...);
int param2 = bar(...);
DoSomething(param1, param2);
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?

很可能.具有函数返回值并且还将副作用应用于固定长度静态分配的缓冲区通常不被认为是最佳实践.但是,我不想告诉你如何解决你的问题,因为我对这个问题知之甚少.