26

ソケットを介して 0 で終わる文字列を処理するC プログラム(Apache モジュール、つまりプログラムが頻繁に実行される) があるため、その長さを知る必要があります。write()

文字列は次のように#定義されます:

#define POLICY "<?xml version=\"1.0\"?>\n" \
   "<!DOCTYPE cross-domain-policy SYSTEM\n" \
   "\"http://www.adobe.com/xml/dtds/cross-domain-policy.dtd\">\n" \
   "<cross-domain-policy>\n" \
   "<allow-access-from domain=\"*\" to-ports=\"8080\"/>\n" \
   "</cross-domain-policy>\0"

strlen(POLICY)+1実行時に使用する(したがって、長さを何度も計算する)よりも良い方法はありますか?

POLICY_LENGTHコンパイル時にすでに設定できるプリプロセッサ ディレクティブはありますか?

4

4 に答える 4

41

を使用しsizeof()ます。たとえば、コンパイル時sizeof("blah")に評価さ5れます (文字列リテラルには常に暗黙の null 終了文字が含まれるため、4 ではなく 5)。

于 2010-10-23T09:59:52.530 に答える
6

コンパイラの最適化を使用1+strlen(POLICY)してオンにします。GCC は、コンパイル時に S の値がわかっている場合、コンパイル時に strlen(S) を S の長さに置き換えます。

于 2014-01-15T12:19:58.323 に答える
2

sizeofコンパイル時に動作します

#define POLICY "<?xml version=\"1.0\"?>\n" \
   "<!DOCTYPE cross-domain-policy SYSTEM\n" \
   "\"http://www.adobe.com/xml/dtds/cross-domain-policy.dtd\">\n" \
   "<cross-domain-policy>\n" \
   "<allow-access-from domain=\"*\" to-ports=\"8080\"/>\n" \
   "</cross-domain-policy>\0"

char pol[sizeof POLICY];
strcpy(pol, POLICY); /* safe, with an extra char to boot */

サイズのプリプロセッサ シンボルが必要な場合は、文字数を数えて自分でシンボルを記述してください :-)

#define POLICY_LENGTH 78 /* just made that number up! */
于 2010-10-23T10:04:18.087 に答える