どのようにconstの-正し下strtolはを実装していますか? C11 _Generic
の
のみを使用して関数のシグネチャの保存が必要とされるように同一である、以下のように、コードは
// when passed argument for `str` is `char *` and for `endptr` is `char **`
long strotol(const char* str, char** endptr, int base);
// or
// when passed argument for `str` is `const char *` and for `endptr` is `const char **`
long strotol_c(const char* str, const char** endptr, int base);
// and warn/error otherwise
実装のいずれかを呼び出すことができるようになります。これはstrtol()
とは異なるので、strtol_s()
のような別のものと呼ぶべきです。 strtol_s()
は真の関数ではありませんので、それへのポインタはできません。失われた何
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
long int strtol_c(const char * restrict nptr, const char ** restrict endptr, int base) {
return strtol((char *) nptr, (char **) endptr, base);
}
#define strtol_s(n,e,b) _Generic(n, \
char *: strtol((n), (e), (b)), \
const char *: strtol_c((n), (e), (b)), \
default: 0 \
)
int main(void) {
char *src = malloc(100);
strcpy(src, "456");
const char *srcc = "123";
char *endptr;
const char *endcptr;
long L[6] = { 0 };
// OK - matching str and *endptr
L[0] = strtol_s(src, &endptr, 0);
// warning: passing argument 2 of 'strtol' from incompatible pointer type
L[1] = strtol_s(src, &endcptr, 0);
// warning: passing argument 2 of 'strtol_c' from incompatible pointer type
L[2] = strtol_s(srcc, &endptr, 0);
// OK - matching str and *endptr
L[3] = strtol_s(srcc, &endcptr, 0);
L[4] = strtol(src, &endptr, 0);
// warning passing argument 2 of 'strtol' from incompatible pointer type
// OK
L[5] = strtol(src, &endcptr, 0);
return !L[0];
}
。
浮動小数点数なしで最初の未処理文字への非constポインタに変換するにはどうすればよいですか?
strtol()
、それは2番目の引数としてchar **endptr
がかかりますが、*endptr
を変更しません。
ベースのstrの方向をオフセットとした「再生」はどうですか? – kazbeel
それは 'const char ** endptr'をとり、そうでなければ等しい実装を持ちますが、http://stackoverflow.com/questions/993700/are-strtol-strtod-unsafeを参照してください。 –
答えは「できません」です。しかしこれは別のより一般的な質問で答えられました。 – dasblinkenlight