C对对象文件有任何保证吗?

C对对象文件有任何保证吗?,c,macros,compilation,c-preprocessor,object-files,C,Macros,Compilation,C Preprocessor,Object Files,我想更改一些C代码,但我想使用#ifdefs,这样就可以编译旧的对象文件(后预处理代码不会更改)。出于某些原因(针对多个平台编译,以及认证原因),我需要保持对象文件的一致性(除了任何时间戳) C语言规范或任何C编译器对重新编译有任何保证吗?我在谷歌上搜索了一下,但是没有找到关于这个话题的任何东西 例如: main.c int main() { printf("Hello World!\n"); return 0; } main.h(新文件) main.c(更新的文件) 如果我在

我想更改一些C代码,但我想使用
#ifdef
s,这样就可以编译旧的对象文件(后预处理代码不会更改)。出于某些原因(针对多个平台编译,以及认证原因),我需要保持对象文件的一致性(除了任何时间戳)

C语言规范或任何C编译器对重新编译有任何保证吗?我在谷歌上搜索了一下,但是没有找到关于这个话题的任何东西

例如:

main.c

int main() {
    printf("Hello World!\n");
    return 0;
}
main.h(新文件)

main.c(更新的文件)


如果我在编译更新后的main.c时未定义DEBUG而现在包含main.h,那么c语言规范或任何c编译器是否保证目标文件是相同的?

c语言对目标文件没有任何保证。甚至工具链也不一定会有类似于对象文件的东西。特定的编译器可能会对自己的对象文件有一些规则,但它们可能有也可能没有很好的文档记录


无论如何,如果您已经有了一个您需要的特定对象文件,那么为什么您如此关心能够重新创建它呢?如果你想建立一个旧版本的软件,你就不能只需要检查版本控制,只要你需要建立它,而不必用同一个地方的每一个版本来扰乱源代码?

也许你应该描述驱动你考虑这个解决方案(XY)的“某些原因”。C标准仅限制编译器生成与规范要求具有相同可观察行为的程序,程序大小不定义为此类可观察行为。公开的api将是相同的,但精确的细节可能会发生变化。我想他们一般不会,但不能保证,因为(例如)优化不是任何规范的一部分。@BrianCain Sure。我已经更新了这个问题,但本质上,我有多个平台,有些平台不能/不想支持特定的功能。这个软件得到认证,因此我不希望其他平台必须重新测试/重新认证更新的部分代码(但执行方式不要不同);例如,GCC声称使用随机分支猜测启发式作为其优化的一部分。我已经更新了这个问题,但原因是我希望在第二个平台上启用/禁用该功能,而不改变代码。它在特定过程中经过认证,因此如果*.o文件发生更改,则必须重新测试。
#ifdef DEBUG
    char some_buffer[1000];
    #define PRINTF(S) (sprintf(some_buffer, S))
#else
    #define PRINTF(S) (printf(S))
#endif
#include "main.h"

int main() {
    PRINTF("Hello World!\n");
    return 0;
}