我有一些C代碼需要更改,但我想使用#ifdef
s,以便可以編譯舊的目標文件(後處理代碼不會更改)。由於某些原因(針對多個平臺進行編譯以及認證原因),我需要保持目標文件完全相同(除了時間戳之外)。C是否對目標文件做出任何保證?
C語言規範還是做任何C編譯器對重新編譯做出任何保證?我一直在做一些谷歌搜索,但我一直沒有找到任何關於這個話題。
例如:
的main.c
int main() {
printf("Hello World!\n");
return 0;
}
main.h(新文件)
#ifdef DEBUG
char some_buffer[1000];
#define PRINTF(S) (sprintf(some_buffer, S))
#else
#define PRINTF(S) (printf(S))
#endif
main.c中(更新文件)
#include "main.h"
int main() {
PRINTF("Hello World!\n");
return 0;
}
如果我要編譯更新的main.c,並且定義了DEBUG 而不是,它現在包含main.h,那麼C語言規範或任何C編譯器是否可以保證目標文件是相同的?
也許你應該描述促使你考慮這個解決方案的「某些原因」(XY)。 – 2014-10-01 19:29:42
無論如何,C標準只會限制編譯器生成具有與spec規範相同的可觀察行爲的程序,程序大小並沒有被定義爲這種可觀察的行爲。 – Deduplicator 2014-10-01 19:32:45
暴露的API將是相同的,但確切的細節可以改變。我想通常他們不會,但不能保證,因爲(例如)優化不是任何規範的一部分。 – Dave 2014-10-01 19:33:13