你知道在C,我們可以初始化字符串變量是這樣的:執行特殊類型的字符串初始化的用C
char text[1024] =
"Hello "
"World";
但如果我有一個返回單詞「世界」的功能?
char text[1024] =
"Hello "
World();
在我看來,這是不可能在C. 請確認。
你知道在C,我們可以初始化字符串變量是這樣的:執行特殊類型的字符串初始化的用C
char text[1024] =
"Hello "
"World";
但如果我有一個返回單詞「世界」的功能?
char text[1024] =
"Hello "
World();
在我看來,這是不可能在C. 請確認。
你想要什麼是不可能的。
Assigment操作符的L值需要可修改,而數組不是。
從C11-標準:
6.5.16/2
賦值操作員有修改的左值作爲它的左操作數。
char text[1024] = "Hello ""World";
從C11-標準:
的唯一例外此使用的文字作爲R值時初始化期間是
6.7.9/14
字符類型的數組可以通過字符串文字或UTF-8字符串 升al,可選地包含在大括號中。字符串文字的連續字節(包括 ,如果有空間或數組大小未知,則終止空字符)將初始化數組的元素 。
答案已接受。 – 2014-11-24 10:01:44
如果World()
的東西,總是返回 「世界」,然後把它定義爲一個宏:
#define World "World"
然後執行:
char text[1024] =
"Hello "
World; //Without parentheses
編輯
字符串連接在你期望的做法是由C預處理器完成的。你實際上是在尋找一個兩個字符串的運行時連接,其中c以多種方式執行。最簡單的一個是由strcat
函數來實現,而應該由函數明確執行初始化:
char text[1024];
void init_text() {
strcpy(text, "Hello ");
strcat(text, World()); //World() defined somewhere else
}
使用sprintf
備選:
void init_text() {
sprintf(text, "Hello %s", World());
}
然後在main
函數,調用init_text()
開頭:
int main() {
init_text();
...
}
標準C中不可能用某些運行時特定的行爲來初始化某些東西。因此,標準的便攜式方法是通過調用main
開頭的函數來初始化數據,如answered by Claudix。但是,如果您最近使用了一些GCC編譯器(或Clang/LLVM),那麼您可以在某些系統(包括Linux和其他POSIX系統)上使用某些constructor attribute on function。所以,你會宣稱:
static void init_text(void) __attribute__((constructor));
,並定義init_text
像Claudix's answer沒有不必調用它的main
:因爲它具有constructor
屬性,它會神奇地main
之前,如果出現叫,或在dlopen(3)在一個動態鏈接的插件或庫中。
更便攜的技巧可能是讓函數返回該文本,以便在第一次調用期間對其進行初始化。因此,不要使用text
,您可以撥打get_my_text()
(可能通過將#define text get_my_text()
放在標題中,但出於可讀性原因,我不建議這樣做,因此請將text
的每次出現替換爲get_my_text()
...),並將其定義爲:
const char*get_my_text() {
static char textbuf[1024];
if (textbuf[0]) {
// already initialized, so return it
return textbuf;
};
snprintf(textbuf, sizeof(textbuf), "Hello %s", World());
return textbuf;
}
當心,這樣的把戲是不可靠的多線程程序:兩個線程可能在同一時間正好運行get_my_text
,和你有一個數據race。在多線程應用中,例如, pthread_once
您甚至可以在頭文件中將get_my_text
定義爲static inline
函數。
PS始終優先選擇snprintf(3)至sprintf
以避免buffer overflows。還要注意,在標準C++任何static
或全球數據與一些給出constructor是main
之前進行初始化... GCC功能屬性故名...
不,這是不可能的。您只能使用此方法連接字符串文字。 – 2014-11-22 11:59:46
@CoolGuy我需要它到初始化部分。問題已關閉。 – 2014-11-22 12:02:16
@alk嗯什麼?你絕對可以... – 2014-11-22 12:02:36