2014-10-01 63 views
2

我有一些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編譯器是否可以保證目標文件是相同的?

+1

也許你應該描述促使你考慮這個解決方案的「某些原因」(XY)。 – 2014-10-01 19:29:42

+0

無論如何,C標準只會限制編譯器生成具有與spec規範相同的可觀察行爲的程序,程序大小並沒有被定義爲這種可觀察的行爲。 – Deduplicator 2014-10-01 19:32:45

+0

暴露的API將是相同的,但確切的細節可以改變。我想通常他們不會,但不能保證,因爲(例如)優化不是任何規範的一部分。 – Dave 2014-10-01 19:33:13

回答

5

C語言對目標文件不作任何保證。甚至連工具鏈都不一定有類似目標文件的東西。特定的編譯器可能會有一些關於它們自己的目標文件的規則,但是它們可能會或可能不會被特別記錄。

無論如何,如果你已經有了一個你需要的特定目標文件,爲什麼你會關心能夠重新創建它?如果你想構建一箇舊版本的軟件,你是否可以在需要構建它時從版本控制中檢查出來,而不必在同一個地方將每個版本的源代碼混淆起來?

+0

我已經更新了這個問題,但原因是我想要在第二個平臺上啓用/禁用該功能,而不需要更改代碼。它在某個過程中得到認證,如果* .o文件發生變化,則必須重新測試。 – Darthfett 2014-10-01 19:41:34

相關問題