Declaración no permitida aquí error en C

La siguiente línea tiene el problema int (*f)(int, int) = (argv[2][0] == 'd') , al comstackrlo, la statement no está permitida aquí. ¿Debería declararse la línea al comienzo, alguna mejor manera de hacerlo? ¿Alguna sugerencia sería muy apreciada?

 #include  #include  #include  int encode(int ch, int key) { if (islower(ch)) { ch = (ch-'a' + key) % 26 + 'a'; ch += (ch < 'a') ? 26 : 0; } else if (isupper(ch)) { ch = (ch-'A' + key) % 26 + 'A'; ch += (ch < 'A') ? 26 : 0; } return ch; } int decode(int ch, int key) { return encode(ch, -key); } int main(int argc, char **argv) { int ch; int key; if (argc < 2) { printf("USAGE: cipher  \n"); printf("Then, just type your text and it will automatically output the en/de crypted text! :)\n"); return 1; } key = atoi(argv[1]); if (key  25) { printf("Key is invalid, or out of range. Valid keys are integers 1 through 25.\n"); return 1; } int (*f)(int, int) = (argv[2][0] == 'd') ? decode : encode; while (EOF != (ch=getchar())) putchar(f(ch, key)); return 0; } 

En C (antes de C99), debe declarar las variables al inicio de un bloque.

Compile su código como C99, o cambie el código para que f se declare al comienzo de un bloque.

En c89 / 90 debe declarar todas las variables en el inicio del bloque.

Pero en c99, puedes comstackr tu código con -std=c99 esta manera:

gcc -Wall -std=c99 test.c -o test.out

Aparte de la parte señalada por NPE, puede usar typedef para crear un tipo de función. Me gusta esto:

typedef void FunctionType (int, int); Y luego utilícelo (como un tipo separado) para crear punteros de función.

Facilita la lectura.

En caso de ser declarada la línea al inicio.

En C89, las definiciones deben aparecer antes de cualquier statement en el bloque. Si lo mueve, no tiene que mover toda la línea (y, por supuesto, no quiere mover toda la línea antes de que el código que verifica argv[2] sea ​​válido). Solo mueve la definición de f :

  int ch; int key; int (*f)(int,int); ... f = (argv[2][0] == 'd') ? decode : encode; 

alguna forma mejor de hacer esto

No es necesariamente mejor en este caso, pero tenga en cuenta que la regla es el inicio de un bloque, no necesariamente el inicio de una función.

Entonces, podrías simplemente escribir:

 { int (*f)(int, int) = (argv[2][0] == 'd') ? decode : encode; while (EOF != (ch=getchar())) putchar(f(ch, key)); } return 0; 

Puedes entrar fácilmente en argumentos sobre este estilo de encoding. Algunas personas piensan que cada función debe definir todas sus variables por adelantado, y que la introducción de un bloque solo para definir una variable es un desorden y / o confuso. Algunas personas (y especialmente aquellas que usan C ++ y C) piensan que debe restringir el scope de cada variable para que sea lo más estrecho posible, para que la definición de todo al inicio de la función sea un desorden y / o confuso. Pero incluso podrían considerar un bloque desnudo excesivo.