diff --git a/internal/cgen/cgen.go b/internal/cgen/cgen.go
index cff1417..ca1b17b 100644
--- a/internal/cgen/cgen.go
+++ b/internal/cgen/cgen.go
@@ -403,7 +403,7 @@
 
 		buf.writes("typedef struct {\n\n")
 		for _, f := range builtInInterfaceMethods[qid] {
-			if err := g.writeFuncSignature(buf, f, wfsCFuncPtr); err != nil {
+			if err := g.writeFuncSignature(buf, f, wfsCFuncPtrField); err != nil {
 				return err
 			}
 			buf.writes(";\n")
@@ -1157,7 +1157,11 @@
 			builtInTokenMap.ByName(iQID[1].Str(g.tm)),
 		}
 		for _, f := range builtInInterfaceMethods[altQID] {
-			b.printf("(void*)(&%s%s__%s),\n",
+			b.writeb('(')
+			if err := g.writeFuncSignature(b, f, wfsCFuncPtrType); err != nil {
+				return err
+			}
+			b.printf(")(&%s%s__%s),\n",
 				g.pkgPrefix, nQID[1].Str(g.tm),
 				f.FuncName().Str(&builtInTokenMap),
 			)
diff --git a/internal/cgen/expr.go b/internal/cgen/expr.go
index d87a7e8..bbb2de3 100644
--- a/internal/cgen/expr.go
+++ b/internal/cgen/expr.go
@@ -363,9 +363,11 @@
 		o := n.Inner()
 		if o.Decorator() == 0 && o.QID() == (t.QID{t.IDBase, t.IDU8}) && !o.IsRefined() {
 			b.writes("wuffs_base__slice_u8")
-			b.writeb(' ')
-			b.writes(varNamePrefix)
-			b.writes(varName)
+			if varNamePrefix != "" {
+				b.writeb(' ')
+				b.writes(varNamePrefix)
+				b.writes(varName)
+			}
 			return nil
 		}
 		return fmt.Errorf("cannot convert Wuffs type %q to C", n.Str(g.tm))
@@ -374,9 +376,11 @@
 		o := n.Inner()
 		if o.Decorator() == 0 && o.QID() == (t.QID{t.IDBase, t.IDU8}) && !o.IsRefined() {
 			b.writes("wuffs_base__table_u8")
-			b.writeb(' ')
-			b.writes(varNamePrefix)
-			b.writes(varName)
+			if varNamePrefix != "" {
+				b.writeb(' ')
+				b.writes(varNamePrefix)
+				b.writes(varName)
+			}
 			return nil
 		}
 		return fmt.Errorf("cannot convert Wuffs type %q to C", n.Str(g.tm))
@@ -420,9 +424,11 @@
 		b.writeb('*')
 	}
 
-	b.writeb(' ')
-	b.writes(varNamePrefix)
-	b.writes(varName)
+	if varNamePrefix != "" {
+		b.writeb(' ')
+		b.writes(varNamePrefix)
+		b.writes(varName)
+	}
 
 	x = n
 	for ; x != nil && x.IsArrayType(); x = x.Inner() {
diff --git a/internal/cgen/func.go b/internal/cgen/func.go
index 1a3cf0c..a6dac27 100644
--- a/internal/cgen/func.go
+++ b/internal/cgen/func.go
@@ -74,9 +74,10 @@
 
 // writeFunctionSignature modes.
 const (
-	wfsCDecl    = 0
-	wfsCppDecl  = 1
-	wfsCFuncPtr = 2
+	wfsCDecl         = 0
+	wfsCppDecl       = 1
+	wfsCFuncPtrField = 2
+	wfsCFuncPtrType  = 3
 )
 
 func (g *gen) writeFuncSignature(b *buffer, n *a.Func, wfs uint32) error {
@@ -91,7 +92,7 @@
 	case wfsCppDecl:
 		b.writes("inline ")
 
-	case wfsCFuncPtr:
+	case wfsCFuncPtrField, wfsCFuncPtrType:
 		// No-op.
 	}
 
@@ -107,7 +108,7 @@
 
 	// The empty // comment makes clang-format place the function name at the
 	// start of a line.
-	if wfs != wfsCFuncPtr {
+	if (wfs != wfsCFuncPtrField) && (wfs != wfsCFuncPtrType) {
 		b.writes("//\n")
 	}
 
@@ -128,14 +129,19 @@
 		b.writes(n.FuncName().Str(g.tm))
 		b.writeb('(')
 
-	case wfsCFuncPtr:
+	case wfsCFuncPtrField, wfsCFuncPtrType:
 		b.writes("(*")
-		b.writes(n.FuncName().Str(g.tm))
+		if wfs == wfsCFuncPtrField {
+			b.writes(n.FuncName().Str(g.tm))
+		}
 		b.writes(")(")
 		if n.Effect().Pure() {
 			b.writes("const ")
 		}
-		b.writes("void* self")
+		b.writes("void*")
+		if wfs == wfsCFuncPtrField {
+			b.writes(" self")
+		}
 		comma = true
 	}
 
@@ -145,7 +151,11 @@
 		}
 		comma = true
 		o := o.AsField()
-		if err := g.writeCTypeName(b, o.XType(), aPrefix, o.Name().Str(g.tm)); err != nil {
+		varNamePrefix, varName := "", ""
+		if wfs != wfsCFuncPtrType {
+			varNamePrefix, varName = aPrefix, o.Name().Str(g.tm)
+		}
+		if err := g.writeCTypeName(b, o.XType(), varNamePrefix, varName); err != nil {
 			return err
 		}
 	}
diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c
index 1575010..ddaa006 100644
--- a/release/c/wuffs-unsupported-snapshot.c
+++ b/release/c/wuffs-unsupported-snapshot.c
@@ -4915,7 +4915,8 @@
 
 const wuffs_base__hasher_u32__func_ptrs
     wuffs_adler32__hasher__func_ptrs_for__wuffs_base__hasher_u32 = {
-        (void*)(&wuffs_adler32__hasher__update_u32),
+        (uint32_t(*)(void*, wuffs_base__slice_u8))(
+            &wuffs_adler32__hasher__update_u32),
 };
 
 // ---------------- Initializer Implementations
@@ -5937,7 +5938,8 @@
 
 const wuffs_base__hasher_u32__func_ptrs
     wuffs_crc32__ieee_hasher__func_ptrs_for__wuffs_base__hasher_u32 = {
-        (void*)(&wuffs_crc32__ieee_hasher__update_u32),
+        (uint32_t(*)(void*, wuffs_base__slice_u8))(
+            &wuffs_crc32__ieee_hasher__update_u32),
 };
 
 // ---------------- Initializer Implementations
